From bcc9141d1b4746bd0066d083df05526cd22907b3 Mon Sep 17 00:00:00 2001 From: Andy Gospodarek Date: Mon, 19 May 2008 15:25:42 -0400 Subject: [PATCH] e1000: add module parameter to set transmit descriptor size RHBZ 334411 This change removes the hard-coded limits on transmit descriptor sizes and allows them to be set as module options. Tuning this size to be smaller does mean that larger frames can reduce performance (since it will now take more descriptors to hold the same amount of data), but reducing the size of the buffers (therefore reducing the duration of a DMA transfer) reduces the chances that we will encounter possbile hardware issues. This change does not specifically modify any default settings -- it simply allows tuning by someone who encounters problems with the defaults. --- 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 65e037c..36a32bb 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 30df2cb..e235770 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c @@ -3168,9 +3168,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; @@ -3464,11 +3461,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)->tso_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 656ac8f..3f089b7 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