S2IO: Optimized the delay to wait for command completion

- Optimized delay to wait for command completion so as to reduce the
initialization wait time.
- Disable differentiated services steering. By default RMAC is configured to
steer traffic with certain DS codes to other queues. Driver must initialize
the DS memory to 0 to make sure that DS steering will not be used by default.

Signed-off-by: Sivakumar Subramani <sivakumar.subramani@neterion.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Sivakumar Subramani and committed by Jeff Garzik 9fc93a41 fb6a825b

+78 -19
+73 -17
drivers/net/s2io.c
··· 1372 1372 } 1373 1373 } 1374 1374 1375 + /* Disable differentiated services steering logic */ 1376 + for (i = 0; i < 64; i++) { 1377 + if (rts_ds_steer(nic, i, 0) == FAILURE) { 1378 + DBG_PRINT(ERR_DBG, "%s: failed rts ds steering", 1379 + dev->name); 1380 + DBG_PRINT(ERR_DBG, "set on codepoint %d\n", i); 1381 + return FAILURE; 1382 + } 1383 + } 1384 + 1375 1385 /* Program statistics memory */ 1376 1386 writeq(mac_control->stats_mem_phy, &bar0->stat_addr); 1377 1387 ··· 3205 3195 * SUCCESS on success and FAILURE on failure. 3206 3196 */ 3207 3197 3208 - static int wait_for_cmd_complete(void __iomem *addr, u64 busy_bit) 3198 + static int wait_for_cmd_complete(void __iomem *addr, u64 busy_bit, 3199 + int bit_state) 3209 3200 { 3210 - int ret = FAILURE, cnt = 0; 3201 + int ret = FAILURE, cnt = 0, delay = 1; 3211 3202 u64 val64; 3212 3203 3213 - while (TRUE) { 3204 + if ((bit_state != S2IO_BIT_RESET) && (bit_state != S2IO_BIT_SET)) 3205 + return FAILURE; 3206 + 3207 + do { 3214 3208 val64 = readq(addr); 3215 - if (!(val64 & busy_bit)) { 3216 - ret = SUCCESS; 3217 - break; 3209 + if (bit_state == S2IO_BIT_RESET) { 3210 + if (!(val64 & busy_bit)) { 3211 + ret = SUCCESS; 3212 + break; 3213 + } 3214 + } else { 3215 + if (!(val64 & busy_bit)) { 3216 + ret = SUCCESS; 3217 + break; 3218 + } 3218 3219 } 3219 3220 3220 3221 if(in_interrupt()) 3221 - mdelay(50); 3222 + mdelay(delay); 3222 3223 else 3223 - msleep(50); 3224 + msleep(delay); 3224 3225 3225 - if (cnt++ > 10) 3226 - break; 3227 - } 3226 + if (++cnt >= 10) 3227 + delay = 50; 3228 + } while (cnt < 20); 3228 3229 return ret; 3229 3230 } 3230 3231 /* ··· 4317 4296 writeq(val64, &bar0->rmac_addr_cmd_mem); 4318 4297 /* Wait till command completes */ 4319 4298 wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, 4320 - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); 4299 + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING, 4300 + S2IO_BIT_RESET); 4321 4301 4322 4302 sp->m_cast_flg = 1; 4323 4303 sp->all_multi_pos = MAC_MC_ALL_MC_ADDR_OFFSET; ··· 4334 4312 writeq(val64, &bar0->rmac_addr_cmd_mem); 4335 4313 /* Wait till command completes */ 4336 4314 wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, 4337 - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); 4315 + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING, 4316 + S2IO_BIT_RESET); 4338 4317 4339 4318 sp->m_cast_flg = 0; 4340 4319 sp->all_multi_pos = 0; ··· 4401 4378 4402 4379 /* Wait for command completes */ 4403 4380 if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, 4404 - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { 4381 + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING, 4382 + S2IO_BIT_RESET)) { 4405 4383 DBG_PRINT(ERR_DBG, "%s: Adding ", 4406 4384 dev->name); 4407 4385 DBG_PRINT(ERR_DBG, "Multicasts failed\n"); ··· 4433 4409 4434 4410 /* Wait for command completes */ 4435 4411 if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, 4436 - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { 4412 + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING, 4413 + S2IO_BIT_RESET)) { 4437 4414 DBG_PRINT(ERR_DBG, "%s: Adding ", 4438 4415 dev->name); 4439 4416 DBG_PRINT(ERR_DBG, "Multicasts failed\n"); ··· 4480 4455 writeq(val64, &bar0->rmac_addr_cmd_mem); 4481 4456 /* Wait till command completes */ 4482 4457 if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, 4483 - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { 4458 + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING, S2IO_BIT_RESET)) { 4484 4459 DBG_PRINT(ERR_DBG, "%s: set_mac_addr failed\n", dev->name); 4485 4460 return FAILURE; 4486 4461 } ··· 6761 6736 } 6762 6737 6763 6738 /** 6739 + * rts_ds_steer - Receive traffic steering based on IPv4 or IPv6 TOS 6740 + * or Traffic class respectively. 6741 + * @nic: device peivate variable 6742 + * Description: The function configures the receive steering to 6743 + * desired receive ring. 6744 + * Return Value: SUCCESS on success and 6745 + * '-1' on failure (endian settings incorrect). 6746 + */ 6747 + static int rts_ds_steer(struct s2io_nic *nic, u8 ds_codepoint, u8 ring) 6748 + { 6749 + struct XENA_dev_config __iomem *bar0 = nic->bar0; 6750 + register u64 val64 = 0; 6751 + 6752 + if (ds_codepoint > 63) 6753 + return FAILURE; 6754 + 6755 + val64 = RTS_DS_MEM_DATA(ring); 6756 + writeq(val64, &bar0->rts_ds_mem_data); 6757 + 6758 + val64 = RTS_DS_MEM_CTRL_WE | 6759 + RTS_DS_MEM_CTRL_STROBE_NEW_CMD | 6760 + RTS_DS_MEM_CTRL_OFFSET(ds_codepoint); 6761 + 6762 + writeq(val64, &bar0->rts_ds_mem_ctrl); 6763 + 6764 + return wait_for_cmd_complete(&bar0->rts_ds_mem_ctrl, 6765 + RTS_DS_MEM_CTRL_STROBE_CMD_BEING_EXECUTED, 6766 + S2IO_BIT_RESET); 6767 + } 6768 + 6769 + /** 6764 6770 * s2io_init_nic - Initialization of the adapter . 6765 6771 * @pdev : structure containing the PCI related information of the device. 6766 6772 * @pre: List of PCI devices supported by the driver listed in s2io_tbl. ··· 7085 7029 RMAC_ADDR_CMD_MEM_OFFSET(0 + MAC_MAC_ADDR_START_OFFSET); 7086 7030 writeq(val64, &bar0->rmac_addr_cmd_mem); 7087 7031 wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, 7088 - RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); 7032 + RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING, S2IO_BIT_RESET); 7089 7033 tmp64 = readq(&bar0->rmac_addr_data0_mem); 7090 7034 mac_down = (u32) tmp64; 7091 7035 mac_up = (u32) (tmp64 >> 32);
+5 -2
drivers/net/s2io.h
··· 32 32 #define FAILURE -1 33 33 #define S2IO_MINUS_ONE 0xFFFFFFFFFFFFFFFFULL 34 34 #define S2IO_MAX_PCI_CONFIG_SPACE_REINIT 100 35 - 35 + #define S2IO_BIT_RESET 1 36 + #define S2IO_BIT_SET 2 36 37 #define CHECKBIT(value, nbit) (value & (1 << nbit)) 37 38 38 39 /* Maximum time to flicker LED when asked to identify NIC using ethtool */ ··· 1006 1005 static void s2io_card_down(struct s2io_nic *nic); 1007 1006 static int s2io_card_up(struct s2io_nic *nic); 1008 1007 static int get_xena_rev_id(struct pci_dev *pdev); 1009 - static int wait_for_cmd_complete(void __iomem *addr, u64 busy_bit); 1008 + static int wait_for_cmd_complete(void __iomem *addr, u64 busy_bit, 1009 + int bit_state); 1010 1010 static int s2io_add_isr(struct s2io_nic * sp); 1011 1011 static void s2io_rem_isr(struct s2io_nic * sp); 1012 1012 ··· 1021 1019 static void update_L3L4_header(struct s2io_nic *sp, struct lro *lro); 1022 1020 static void lro_append_pkt(struct s2io_nic *sp, struct lro *lro, 1023 1021 struct sk_buff *skb, u32 tcp_len); 1022 + static int rts_ds_steer(struct s2io_nic *nic, u8 ds_codepoint, u8 ring); 1024 1023 1025 1024 #define s2io_tcp_mss(skb) skb_shinfo(skb)->gso_size 1026 1025 #define s2io_udp_mss(skb) skb_shinfo(skb)->gso_size