📄 e1000_param.c
字号:
arg: { r: { min: MIN_RXD }} }; struct e1000_desc_ring *rx_ring = &adapter->rx_ring; e1000_mac_type mac_type = adapter->hw.mac_type; opt.arg.r.max = mac_type < e1000_82544 ? MAX_RXD : MAX_82544_RXD; rx_ring->count = RxDescriptors[bd]; e1000_validate_option(&rx_ring->count, &opt); E1000_ROUNDUP(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE); } { /* Checksum Offload Enable/Disable */ struct e1000_option opt = { type: enable_option, name: "Checksum Offload", err: "defaulting to Enabled", def: OPTION_ENABLED }; int rx_csum = XsumRX[bd]; e1000_validate_option(&rx_csum, &opt); adapter->rx_csum = rx_csum; } { /* Flow Control */ struct e1000_opt_list fc_list[] = {{ e1000_fc_none, "Flow Control Disabled" }, { e1000_fc_rx_pause,"Flow Control Receive Only" }, { e1000_fc_tx_pause,"Flow Control Transmit Only" }, { e1000_fc_full, "Flow Control Enabled" }, { e1000_fc_default, "Flow Control Hardware Default" }}; struct e1000_option opt = { type: list_option, name: "Flow Control", err: "reading default settings from EEPROM", def: e1000_fc_none, /* RTM, was e1000_fc_default */ arg: { l: { nr: ARRAY_SIZE(fc_list), p: fc_list }} }; int fc = FlowControl[bd]; e1000_validate_option(&fc, &opt); adapter->hw.fc = adapter->hw.original_fc = fc; } { /* Transmit Interrupt Delay */ char *tidv = "using default of " __MODULE_STRING(DEFAULT_TIDV); struct e1000_option opt = { type: range_option, name: "Transmit Interrupt Delay", arg: { r: { min: MIN_TXDELAY, max: MAX_TXDELAY }} }; opt.def = DEFAULT_TIDV; opt.err = tidv; adapter->tx_int_delay = TxIntDelay[bd]; e1000_validate_option(&adapter->tx_int_delay, &opt); } { /* Transmit Absolute Interrupt Delay */ char *tadv = "using default of " __MODULE_STRING(DEFAULT_TADV); struct e1000_option opt = { type: range_option, name: "Transmit Absolute Interrupt Delay", arg: { r: { min: MIN_TXABSDELAY, max: MAX_TXABSDELAY }} }; opt.def = DEFAULT_TADV; opt.err = tadv; adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; e1000_validate_option(&adapter->tx_abs_int_delay, &opt); } { /* Receive Interrupt Delay */ char *rdtr = "using default of " __MODULE_STRING(DEFAULT_RDTR); char *rdtr_82544 = "using default of " __MODULE_STRING(DEFAULT_RDTR_82544); struct e1000_option opt = { type: range_option, name: "Receive Interrupt Delay", arg: { r: { min: MIN_RXDELAY, max: MAX_RXDELAY }} }; e1000_mac_type mac_type = adapter->hw.mac_type; opt.def = mac_type > e1000_82544 ? DEFAULT_RDTR : 0; opt.err = mac_type > e1000_82544 ? rdtr : rdtr_82544; adapter->rx_int_delay = RxIntDelay[bd]; e1000_validate_option(&adapter->rx_int_delay, &opt); } { /* Receive Absolute Interrupt Delay */ char *radv = "using default of " __MODULE_STRING(DEFAULT_RADV); struct e1000_option opt = { type: range_option, name: "Receive Absolute Interrupt Delay", arg: { r: { min: MIN_RXABSDELAY, max: MAX_RXABSDELAY }} }; opt.def = DEFAULT_RADV; opt.err = radv; adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; e1000_validate_option(&adapter->rx_abs_int_delay, &opt); } switch(adapter->hw.media_type) { case e1000_media_type_fiber: e1000_check_fiber_options(adapter); break; case e1000_media_type_copper: e1000_check_copper_options(adapter); break; default: BUG(); }}/** * e1000_check_fiber_options - Range Checking for Link Options, Fiber Version * @adapter: board private structure * * Handles speed and duplex options on fiber adapters **/static void __devinite1000_check_fiber_options(struct e1000_adapter *adapter){ int bd = adapter->bd_number; bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; if((Speed[bd] != OPTION_UNSET)) { printk(KERN_INFO "Speed not valid for fiber adapters, " "parameter ignored\n"); } if((Duplex[bd] != OPTION_UNSET)) { printk(KERN_INFO "Duplex not valid for fiber adapters, " "parameter ignored\n"); } if((AutoNeg[bd] != OPTION_UNSET)) { printk(KERN_INFO "AutoNeg not valid for fiber adapters, " "parameter ignored\n"); }}/** * e1000_check_copper_options - Range Checking for Link Options, Copper Version * @adapter: board private structure * * Handles speed and duplex options on copper adapters **/static void __devinite1000_check_copper_options(struct e1000_adapter *adapter){ int speed, dplx; int bd = adapter->bd_number; bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; { /* Speed */ struct e1000_opt_list speed_list[] = {{ 0, "" }, { SPEED_10, "" }, { SPEED_100, "" }, { SPEED_1000, "" }}; struct e1000_option opt = { type: list_option, name: "Speed", err: "parameter ignored", def: 0, arg: { l: { nr: ARRAY_SIZE(speed_list), p: speed_list }} }; speed = Speed[bd]; e1000_validate_option(&speed, &opt); } { /* Duplex */ struct e1000_opt_list dplx_list[] = {{ 0, "" }, { HALF_DUPLEX, "" }, { FULL_DUPLEX, "" }}; struct e1000_option opt = { type: list_option, name: "Duplex", err: "parameter ignored", def: 0, arg: { l: { nr: ARRAY_SIZE(dplx_list), p: dplx_list }} }; dplx = Duplex[bd]; e1000_validate_option(&dplx, &opt); } if(AutoNeg[bd] != OPTION_UNSET && (speed != 0 || dplx != 0)) { printk(KERN_INFO "AutoNeg specified along with Speed or Duplex, " "parameter ignored\n"); adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT; } else { /* Autoneg */ struct e1000_opt_list an_list[] = #define AA "AutoNeg advertising " {{ 0x01, AA "10/HD" }, { 0x02, AA "10/FD" }, { 0x03, AA "10/FD, 10/HD" }, { 0x04, AA "100/HD" }, { 0x05, AA "100/HD, 10/HD" }, { 0x06, AA "100/HD, 10/FD" }, { 0x07, AA "100/HD, 10/FD, 10/HD" }, { 0x08, AA "100/FD" }, { 0x09, AA "100/FD, 10/HD" }, { 0x0a, AA "100/FD, 10/FD" }, { 0x0b, AA "100/FD, 10/FD, 10/HD" }, { 0x0c, AA "100/FD, 100/HD" }, { 0x0d, AA "100/FD, 100/HD, 10/HD" }, { 0x0e, AA "100/FD, 100/HD, 10/FD" }, { 0x0f, AA "100/FD, 100/HD, 10/FD, 10/HD" }, { 0x20, AA "1000/FD" }, { 0x21, AA "1000/FD, 10/HD" }, { 0x22, AA "1000/FD, 10/FD" }, { 0x23, AA "1000/FD, 10/FD, 10/HD" }, { 0x24, AA "1000/FD, 100/HD" }, { 0x25, AA "1000/FD, 100/HD, 10/HD" }, { 0x26, AA "1000/FD, 100/HD, 10/FD" }, { 0x27, AA "1000/FD, 100/HD, 10/FD, 10/HD" }, { 0x28, AA "1000/FD, 100/FD" }, { 0x29, AA "1000/FD, 100/FD, 10/HD" }, { 0x2a, AA "1000/FD, 100/FD, 10/FD" }, { 0x2b, AA "1000/FD, 100/FD, 10/FD, 10/HD" }, { 0x2c, AA "1000/FD, 100/FD, 100/HD" }, { 0x2d, AA "1000/FD, 100/FD, 100/HD, 10/HD" }, { 0x2e, AA "1000/FD, 100/FD, 100/HD, 10/FD" }, { 0x2f, AA "1000/FD, 100/FD, 100/HD, 10/FD, 10/HD" }}; struct e1000_option opt = { type: list_option, name: "AutoNeg", err: "parameter ignored", def: AUTONEG_ADV_DEFAULT, arg: { l: { nr: ARRAY_SIZE(an_list), p: an_list }} }; int an = AutoNeg[bd]; e1000_validate_option(&an, &opt); adapter->hw.autoneg_advertised = an; } switch (speed + dplx) { case 0: adapter->hw.autoneg = 1; if(Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET) printk(KERN_INFO "Speed and duplex autonegotiation enabled\n"); break; case HALF_DUPLEX: printk(KERN_INFO "Half Duplex specified without Speed\n"); printk(KERN_INFO "Using Autonegotiation at Half Duplex only\n"); adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | ADVERTISE_100_HALF; break; case FULL_DUPLEX: printk(KERN_INFO "Full Duplex specified without Speed\n"); printk(KERN_INFO "Using Autonegotiation at Full Duplex only\n"); adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_10_FULL | ADVERTISE_100_FULL | ADVERTISE_1000_FULL; break; case SPEED_10: printk(KERN_INFO "10 Mbps Speed specified without Duplex\n"); printk(KERN_INFO "Using Autonegotiation at 10 Mbps only\n"); adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | ADVERTISE_10_FULL; break; case SPEED_10 + HALF_DUPLEX: printk(KERN_INFO "Forcing to 10 Mbps Half Duplex\n"); adapter->hw.autoneg = 0; adapter->hw.forced_speed_duplex = e1000_10_half; adapter->hw.autoneg_advertised = 0; break; case SPEED_10 + FULL_DUPLEX: printk(KERN_INFO "Forcing to 10 Mbps Full Duplex\n"); adapter->hw.autoneg = 0; adapter->hw.forced_speed_duplex = e1000_10_full; adapter->hw.autoneg_advertised = 0; break; case SPEED_100: printk(KERN_INFO "100 Mbps Speed specified without Duplex\n"); printk(KERN_INFO "Using Autonegotiation at 100 Mbps only\n"); adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_100_HALF | ADVERTISE_100_FULL; break; case SPEED_100 + HALF_DUPLEX: printk(KERN_INFO "Forcing to 100 Mbps Half Duplex\n"); adapter->hw.autoneg = 0; adapter->hw.forced_speed_duplex = e1000_100_half; adapter->hw.autoneg_advertised = 0; break; case SPEED_100 + FULL_DUPLEX: printk(KERN_INFO "Forcing to 100 Mbps Full Duplex\n"); adapter->hw.autoneg = 0; adapter->hw.forced_speed_duplex = e1000_100_full; adapter->hw.autoneg_advertised = 0; break; case SPEED_1000: printk(KERN_INFO "1000 Mbps Speed specified without Duplex\n"); printk(KERN_INFO "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; break; case SPEED_1000 + HALF_DUPLEX: printk(KERN_INFO "Half Duplex is not supported at 1000 Mbps\n"); printk(KERN_INFO "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; break; case SPEED_1000 + FULL_DUPLEX: printk(KERN_INFO "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); adapter->hw.autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; break; default: BUG(); } /* Speed, AutoNeg and MDI/MDI-X must all play nice */ if (e1000_validate_mdi_setting(&(adapter->hw)) < 0) { printk(KERN_INFO "Speed, AutoNeg and MDI-X specifications are " "incompatible. Setting MDI-X to a compatible value.\n"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -