Commit 953784d6 authored by Auke Kok's avatar Auke Kok Committed by Auke Kok

ixgb: fix flow control

Make default flow control only have *sending* of flow control packets
enabled, and fix to disable / enable flow control correctly. Set flow
control defaults to disable receiving flow control from the link
partner, to fix the transmit fifo overlow errata
Signed-off-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: default avatarAuke Kok <auke-jan.h.kok@intel.com>
Signed-off-by: default avatarJohn Ronciak <john.ronciak@intel.com>
parent 4de17c8c
...@@ -76,7 +76,7 @@ IXGB_PARAM(RxDescriptors, "Number of receive descriptors"); ...@@ -76,7 +76,7 @@ IXGB_PARAM(RxDescriptors, "Number of receive descriptors");
* - 2 - Tx only, generate PAUSE frames but ignore them on receive * - 2 - Tx only, generate PAUSE frames but ignore them on receive
* - 3 - Full Flow Control Support * - 3 - Full Flow Control Support
* *
* Default Value: Read flow control settings from the EEPROM * Default Value: 2 - Tx only (silicon bug avoidance)
*/ */
IXGB_PARAM(FlowControl, "Flow Control setting"); IXGB_PARAM(FlowControl, "Flow Control setting");
...@@ -137,7 +137,7 @@ IXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold"); ...@@ -137,7 +137,7 @@ IXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold");
* *
* Valid Range: 1 - 65535 * Valid Range: 1 - 65535
* *
* Default Value: 256 (0x100) * Default Value: 65535 (0xffff) (we'll send an xon if we recover)
*/ */
IXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout"); IXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout");
...@@ -165,8 +165,6 @@ IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable"); ...@@ -165,8 +165,6 @@ IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable");
#define XSUMRX_DEFAULT OPTION_ENABLED #define XSUMRX_DEFAULT OPTION_ENABLED
#define FLOW_CONTROL_FULL ixgb_fc_full
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
#define DEFAULT_FCRTL 0x28000 #define DEFAULT_FCRTL 0x28000
#define DEFAULT_FCRTH 0x30000 #define DEFAULT_FCRTH 0x30000
#define MIN_FCRTL 0 #define MIN_FCRTL 0
...@@ -174,9 +172,9 @@ IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable"); ...@@ -174,9 +172,9 @@ IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable");
#define MIN_FCRTH 8 #define MIN_FCRTH 8
#define MAX_FCRTH 0x3FFF0 #define MAX_FCRTH 0x3FFF0
#define DEFAULT_FCPAUSE 0x100 /* this may be too long */
#define MIN_FCPAUSE 1 #define MIN_FCPAUSE 1
#define MAX_FCPAUSE 0xffff #define MAX_FCPAUSE 0xffff
#define DEFAULT_FCPAUSE 0xFFFF /* this may be too long */
struct ixgb_option { struct ixgb_option {
enum { enable_option, range_option, list_option } type; enum { enable_option, range_option, list_option } type;
...@@ -336,7 +334,7 @@ ixgb_check_options(struct ixgb_adapter *adapter) ...@@ -336,7 +334,7 @@ ixgb_check_options(struct ixgb_adapter *adapter)
.type = list_option, .type = list_option,
.name = "Flow Control", .name = "Flow Control",
.err = "reading default settings from EEPROM", .err = "reading default settings from EEPROM",
.def = ixgb_fc_full, .def = ixgb_fc_tx_pause,
.arg = { .l = { .nr = LIST_LEN(fc_list), .arg = { .l = { .nr = LIST_LEN(fc_list),
.p = fc_list }} .p = fc_list }}
}; };
...@@ -365,8 +363,8 @@ ixgb_check_options(struct ixgb_adapter *adapter) ...@@ -365,8 +363,8 @@ ixgb_check_options(struct ixgb_adapter *adapter)
} else { } else {
adapter->hw.fc.high_water = opt.def; adapter->hw.fc.high_water = opt.def;
} }
if(!(adapter->hw.fc.type & ixgb_fc_rx_pause) ) if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
printk (KERN_INFO printk (KERN_INFO
"Ignoring RxFCHighThresh when no RxFC\n"); "Ignoring RxFCHighThresh when no RxFC\n");
} }
{ /* Receive Flow Control Low Threshold */ { /* Receive Flow Control Low Threshold */
...@@ -385,8 +383,8 @@ ixgb_check_options(struct ixgb_adapter *adapter) ...@@ -385,8 +383,8 @@ ixgb_check_options(struct ixgb_adapter *adapter)
} else { } else {
adapter->hw.fc.low_water = opt.def; adapter->hw.fc.low_water = opt.def;
} }
if(!(adapter->hw.fc.type & ixgb_fc_rx_pause) ) if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
printk (KERN_INFO printk (KERN_INFO
"Ignoring RxFCLowThresh when no RxFC\n"); "Ignoring RxFCLowThresh when no RxFC\n");
} }
{ /* Flow Control Pause Time Request*/ { /* Flow Control Pause Time Request*/
...@@ -406,12 +404,12 @@ ixgb_check_options(struct ixgb_adapter *adapter) ...@@ -406,12 +404,12 @@ ixgb_check_options(struct ixgb_adapter *adapter)
} else { } else {
adapter->hw.fc.pause_time = opt.def; adapter->hw.fc.pause_time = opt.def;
} }
if(!(adapter->hw.fc.type & ixgb_fc_rx_pause) ) if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
printk (KERN_INFO printk (KERN_INFO
"Ignoring FCReqTimeout when no RxFC\n"); "Ignoring FCReqTimeout when no RxFC\n");
} }
/* high low and spacing check for rx flow control thresholds */ /* high low and spacing check for rx flow control thresholds */
if (adapter->hw.fc.type & ixgb_fc_rx_pause) { if (adapter->hw.fc.type & ixgb_fc_tx_pause) {
/* high must be greater than low */ /* high must be greater than low */
if (adapter->hw.fc.high_water < (adapter->hw.fc.low_water + 8)) { if (adapter->hw.fc.high_water < (adapter->hw.fc.low_water + 8)) {
/* set defaults */ /* set defaults */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment