From 1136359e979bcafbc41bae142c3196ef5f950ec8 Mon Sep 17 00:00:00 2001 From: Andrew Gospodarek Date: Wed, 11 Jun 2008 11:58:44 -0400 Subject: [PATCH] e1000: add module parameter to set tx descriptor power RHBZ 436966 TxDescPower represents the size-order of each transmit descriptor. The valid size for descriptors would be 2^6 (64) to 2^12 (4096) bytes each. As this value decreases one may want to consider increasing the TxDescriptors value to maintain the same amount of frame memory. --- drivers/net/e1000/e1000.h | 6 ++++++ drivers/net/e1000/e1000_main.c | 12 ++---------- drivers/net/e1000/e1000_param.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h index 18ef6e7..9992a5c 100644 --- a/drivers/net/e1000/e1000.h +++ b/drivers/net/e1000/e1000.h @@ -103,6 +103,11 @@ struct e1000_adapter; #define E1000_MIN_TXD 80 #define E1000_MAX_82544_TXD 4096 +#define E1000_DEFAULT_TXD_PWR 12 +#define E1000_MAX_TXD_PWR 12 +#define E1000_MIN_TXD_PWR 6 +#define E1000_MAX_82571_TXD_PWR 13 + #define E1000_DEFAULT_RXD 256 #define E1000_MAX_RXD 256 #define E1000_MIN_RXD 80 @@ -286,6 +291,7 @@ struct e1000_adapter { atomic_t tx_fifo_stall; boolean_t pcix_82544; boolean_t detect_tx_hung; + uint32_t tx_desc_pwr; /* RX */ #ifdef CONFIG_E1000_NAPI diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 1366a07..6663908 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c @@ -2989,9 +2989,6 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, return FALSE; } -#define E1000_MAX_TXD_PWR 12 -#define E1000_MAX_DATA_PER_TXD (1<tx_desc_pwr; + unsigned int first, max_per_txd = (1 << max_txd_pwr); unsigned int tx_flags = 0; unsigned int len = skb->len - skb->data_len; unsigned long flags; @@ -3285,11 +3282,6 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) return NETDEV_TX_OK; } - /* 82571 and newer doesn't need the workaround that limited descriptor - * length to 4kB */ - if (adapter->hw.mac_type >= e1000_82571) - max_per_txd = 8192; - mss = skb_shinfo(skb)->gso_size; /* The controller does a simple calculation to * make sure there is enough room in the FIFO before diff --git a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c index e6565ce..ebaac5d 100644 --- a/drivers/net/e1000/e1000_param.c +++ b/drivers/net/e1000/e1000_param.c @@ -59,6 +59,18 @@ */ E1000_PARAM(TxDescriptors, "Number of transmit descriptors"); +/* Transmit Descriptor Power + * + * Valid Range: 6-12 + * This value represents the size-order of each transmit descriptor. + * The valid size for descriptors would be 2^6 (64) to 2^12 (4096) bytes + * each. As this value decreases one may want to consider increasing + * the TxDescriptors value to maintain the same amount of frame memory. + * + * Default Value: 12 + */ +E1000_PARAM(TxDescPower, "Binary exponential size (2^X) of each transmit descriptor"); + /* Receive Descriptor Count * * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers @@ -68,6 +80,8 @@ E1000_PARAM(TxDescriptors, "Number of transmit descriptors"); */ E1000_PARAM(RxDescriptors, "Number of receive descriptors"); + + /* User Specified Speed Override * * Valid Range: 0, 10, 100, 1000 @@ -314,6 +328,27 @@ e1000_check_options(struct e1000_adapter *adapter) for (i = 0; i < adapter->num_tx_queues; i++) tx_ring[i].count = tx_ring->count; } + { /* Transmit Descriptor Power */ + struct e1000_option opt = { + .type = range_option, + .name = "Transmit Descriptor Power", + .err = "using default of " + __MODULE_STRING(E1000_DEFAULT_TXD_PWR), + .def = adapter->hw.mac_type < e1000_82571 ? + E1000_MAX_TXD_PWR : E1000_MAX_82571_TXD_PWR, + .arg = { .r = { .min = E1000_MIN_TXD_PWR }} + }; + opt.arg.r.max = adapter->hw.mac_type < e1000_82571 ? + E1000_MAX_TXD_PWR : E1000_MAX_82571_TXD_PWR; + + if (num_TxDescPower > bd) { + adapter->tx_desc_pwr = TxDescPower[bd]; + e1000_validate_option(&adapter->tx_desc_pwr, &opt, adapter); + } else { + adapter->tx_desc_pwr = opt.def; + } + } + { /* Receive Descriptor Count */ struct e1000_option opt = { .type = range_option, -- 1.5.2.1