diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/s2io.c | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index e7c428561e3f..abf910e40334 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -365,10 +365,9 @@ static int init_shared_mem(struct s2io_nic *nic) | |||
365 | size += config->tx_cfg[i].fifo_len; | 365 | size += config->tx_cfg[i].fifo_len; |
366 | } | 366 | } |
367 | if (size > MAX_AVAILABLE_TXDS) { | 367 | if (size > MAX_AVAILABLE_TXDS) { |
368 | DBG_PRINT(ERR_DBG, "%s: Total number of Tx FIFOs ", | 368 | DBG_PRINT(ERR_DBG, "%s: Requested TxDs too high, ", |
369 | dev->name); | 369 | __FUNCTION__); |
370 | DBG_PRINT(ERR_DBG, "exceeds the maximum value "); | 370 | DBG_PRINT(ERR_DBG, "Requested: %d, max supported: 8192\n", size); |
371 | DBG_PRINT(ERR_DBG, "that can be used\n"); | ||
372 | return FAILURE; | 371 | return FAILURE; |
373 | } | 372 | } |
374 | 373 | ||
@@ -611,8 +610,9 @@ static void free_shared_mem(struct s2io_nic *nic) | |||
611 | lst_per_page); | 610 | lst_per_page); |
612 | for (j = 0; j < page_num; j++) { | 611 | for (j = 0; j < page_num; j++) { |
613 | int mem_blks = (j * lst_per_page); | 612 | int mem_blks = (j * lst_per_page); |
614 | if (!mac_control->fifos[i].list_info[mem_blks]. | 613 | if ((!mac_control->fifos[i].list_info) || |
615 | list_virt_addr) | 614 | (!mac_control->fifos[i].list_info[mem_blks]. |
615 | list_virt_addr)) | ||
616 | break; | 616 | break; |
617 | pci_free_consistent(nic->pdev, PAGE_SIZE, | 617 | pci_free_consistent(nic->pdev, PAGE_SIZE, |
618 | mac_control->fifos[i]. | 618 | mac_control->fifos[i]. |
@@ -2594,6 +2594,8 @@ static void tx_intr_handler(fifo_info_t *fifo_data) | |||
2594 | for (j = 0; j < frg_cnt; j++, txdlp++) { | 2594 | for (j = 0; j < frg_cnt; j++, txdlp++) { |
2595 | skb_frag_t *frag = | 2595 | skb_frag_t *frag = |
2596 | &skb_shinfo(skb)->frags[j]; | 2596 | &skb_shinfo(skb)->frags[j]; |
2597 | if (!txdlp->Buffer_Pointer) | ||
2598 | break; | ||
2597 | pci_unmap_page(nic->pdev, | 2599 | pci_unmap_page(nic->pdev, |
2598 | (dma_addr_t) | 2600 | (dma_addr_t) |
2599 | txdlp-> | 2601 | txdlp-> |
@@ -2744,6 +2746,10 @@ void s2io_reset(nic_t * sp) | |||
2744 | u64 val64; | 2746 | u64 val64; |
2745 | u16 subid, pci_cmd; | 2747 | u16 subid, pci_cmd; |
2746 | 2748 | ||
2749 | /* Back up the PCI-X CMD reg, dont want to lose MMRBC, OST settings */ | ||
2750 | if (sp->device_type == XFRAME_I_DEVICE) | ||
2751 | pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, &(pci_cmd)); | ||
2752 | |||
2747 | val64 = SW_RESET_ALL; | 2753 | val64 = SW_RESET_ALL; |
2748 | writeq(val64, &bar0->sw_reset); | 2754 | writeq(val64, &bar0->sw_reset); |
2749 | 2755 | ||
@@ -2762,8 +2768,10 @@ void s2io_reset(nic_t * sp) | |||
2762 | msleep(250); | 2768 | msleep(250); |
2763 | 2769 | ||
2764 | if (!(sp->device_type & XFRAME_II_DEVICE)) { | 2770 | if (!(sp->device_type & XFRAME_II_DEVICE)) { |
2765 | /* Restore the PCI state saved during initializarion. */ | 2771 | /* Restore the PCI state saved during initializarion. */ |
2766 | pci_restore_state(sp->pdev); | 2772 | pci_restore_state(sp->pdev); |
2773 | pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, | ||
2774 | pci_cmd); | ||
2767 | } else { | 2775 | } else { |
2768 | pci_set_master(sp->pdev); | 2776 | pci_set_master(sp->pdev); |
2769 | } | 2777 | } |
@@ -2974,7 +2982,7 @@ int s2io_open(struct net_device *dev) | |||
2974 | * Nic is initialized | 2982 | * Nic is initialized |
2975 | */ | 2983 | */ |
2976 | netif_carrier_off(dev); | 2984 | netif_carrier_off(dev); |
2977 | sp->last_link_state = LINK_DOWN; | 2985 | sp->last_link_state = 0; |
2978 | 2986 | ||
2979 | /* Initialize H/W and enable interrupts */ | 2987 | /* Initialize H/W and enable interrupts */ |
2980 | if (s2io_card_up(sp)) { | 2988 | if (s2io_card_up(sp)) { |
@@ -3102,6 +3110,15 @@ int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3102 | spin_unlock_irqrestore(&sp->tx_lock, flags); | 3110 | spin_unlock_irqrestore(&sp->tx_lock, flags); |
3103 | return 0; | 3111 | return 0; |
3104 | } | 3112 | } |
3113 | |||
3114 | /* A buffer with no data will be dropped */ | ||
3115 | if (!skb->len) { | ||
3116 | DBG_PRINT(TX_DBG, "%s:Buffer has no data..\n", dev->name); | ||
3117 | dev_kfree_skb(skb); | ||
3118 | spin_unlock_irqrestore(&sp->tx_lock, flags); | ||
3119 | return 0; | ||
3120 | } | ||
3121 | |||
3105 | #ifdef NETIF_F_TSO | 3122 | #ifdef NETIF_F_TSO |
3106 | mss = skb_shinfo(skb)->tso_size; | 3123 | mss = skb_shinfo(skb)->tso_size; |
3107 | if (mss) { | 3124 | if (mss) { |
@@ -3136,6 +3153,9 @@ int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3136 | /* For fragmented SKB. */ | 3153 | /* For fragmented SKB. */ |
3137 | for (i = 0; i < frg_cnt; i++) { | 3154 | for (i = 0; i < frg_cnt; i++) { |
3138 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 3155 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
3156 | /* A '0' length fragment will be ignored */ | ||
3157 | if (!frag->size) | ||
3158 | continue; | ||
3139 | txdp++; | 3159 | txdp++; |
3140 | txdp->Buffer_Pointer = (u64) pci_map_page | 3160 | txdp->Buffer_Pointer = (u64) pci_map_page |
3141 | (sp->pdev, frag->page, frag->page_offset, | 3161 | (sp->pdev, frag->page, frag->page_offset, |
@@ -5257,7 +5277,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
5257 | config = &sp->config; | 5277 | config = &sp->config; |
5258 | 5278 | ||
5259 | /* Tx side parameters. */ | 5279 | /* Tx side parameters. */ |
5260 | tx_fifo_len[0] = DEFAULT_FIFO_LEN; /* Default value. */ | 5280 | if (tx_fifo_len[0] == 0) |
5281 | tx_fifo_len[0] = DEFAULT_FIFO_LEN; /* Default value. */ | ||
5261 | config->tx_fifo_num = tx_fifo_num; | 5282 | config->tx_fifo_num = tx_fifo_num; |
5262 | for (i = 0; i < MAX_TX_FIFOS; i++) { | 5283 | for (i = 0; i < MAX_TX_FIFOS; i++) { |
5263 | config->tx_cfg[i].fifo_len = tx_fifo_len[i]; | 5284 | config->tx_cfg[i].fifo_len = tx_fifo_len[i]; |
@@ -5280,7 +5301,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
5280 | config->max_txds = MAX_SKB_FRAGS; | 5301 | config->max_txds = MAX_SKB_FRAGS; |
5281 | 5302 | ||
5282 | /* Rx side parameters. */ | 5303 | /* Rx side parameters. */ |
5283 | rx_ring_sz[0] = SMALL_BLK_CNT; /* Default value. */ | 5304 | if (rx_ring_sz[0] == 0) |
5305 | rx_ring_sz[0] = SMALL_BLK_CNT; /* Default value. */ | ||
5284 | config->rx_ring_num = rx_ring_num; | 5306 | config->rx_ring_num = rx_ring_num; |
5285 | for (i = 0; i < MAX_RX_RINGS; i++) { | 5307 | for (i = 0; i < MAX_RX_RINGS; i++) { |
5286 | config->rx_cfg[i].num_rxd = rx_ring_sz[i] * | 5308 | config->rx_cfg[i].num_rxd = rx_ring_sz[i] * |
@@ -5310,7 +5332,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
5310 | /* initialize the shared memory used by the NIC and the host */ | 5332 | /* initialize the shared memory used by the NIC and the host */ |
5311 | if (init_shared_mem(sp)) { | 5333 | if (init_shared_mem(sp)) { |
5312 | DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", | 5334 | DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", |
5313 | dev->name); | 5335 | __FUNCTION__); |
5314 | ret = -ENOMEM; | 5336 | ret = -ENOMEM; |
5315 | goto mem_alloc_failed; | 5337 | goto mem_alloc_failed; |
5316 | } | 5338 | } |
@@ -5488,7 +5510,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
5488 | sp->def_mac_addr[0].mac_addr[3], | 5510 | sp->def_mac_addr[0].mac_addr[3], |
5489 | sp->def_mac_addr[0].mac_addr[4], | 5511 | sp->def_mac_addr[0].mac_addr[4], |
5490 | sp->def_mac_addr[0].mac_addr[5]); | 5512 | sp->def_mac_addr[0].mac_addr[5]); |
5491 | int mode = s2io_print_pci_mode(sp); | 5513 | mode = s2io_print_pci_mode(sp); |
5492 | if (mode < 0) { | 5514 | if (mode < 0) { |
5493 | DBG_PRINT(ERR_DBG, " Unsupported PCI bus mode "); | 5515 | DBG_PRINT(ERR_DBG, " Unsupported PCI bus mode "); |
5494 | ret = -EBADSLT; | 5516 | ret = -EBADSLT; |