diff options
Diffstat (limited to 'drivers/net/sky2.c')
-rw-r--r-- | drivers/net/sky2.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 3a086d3a7cbf..4f83f111bb20 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -70,18 +70,15 @@ | |||
70 | VLAN:GSO + CKSUM + Data + skb_frags * DMA */ | 70 | VLAN:GSO + CKSUM + Data + skb_frags * DMA */ |
71 | #define MAX_SKB_TX_LE (2 + (sizeof(dma_addr_t)/sizeof(u32))*(MAX_SKB_FRAGS+1)) | 71 | #define MAX_SKB_TX_LE (2 + (sizeof(dma_addr_t)/sizeof(u32))*(MAX_SKB_FRAGS+1)) |
72 | #define TX_MIN_PENDING (MAX_SKB_TX_LE+1) | 72 | #define TX_MIN_PENDING (MAX_SKB_TX_LE+1) |
73 | #define TX_MAX_PENDING 4096 | 73 | #define TX_MAX_PENDING 1024 |
74 | #define TX_DEF_PENDING 127 | 74 | #define TX_DEF_PENDING 127 |
75 | 75 | ||
76 | #define STATUS_RING_SIZE 2048 /* 2 ports * (TX + 2*RX) */ | ||
77 | #define STATUS_LE_BYTES (STATUS_RING_SIZE*sizeof(struct sky2_status_le)) | ||
78 | #define TX_WATCHDOG (5 * HZ) | 76 | #define TX_WATCHDOG (5 * HZ) |
79 | #define NAPI_WEIGHT 64 | 77 | #define NAPI_WEIGHT 64 |
80 | #define PHY_RETRIES 1000 | 78 | #define PHY_RETRIES 1000 |
81 | 79 | ||
82 | #define SKY2_EEPROM_MAGIC 0x9955aabb | 80 | #define SKY2_EEPROM_MAGIC 0x9955aabb |
83 | 81 | ||
84 | |||
85 | #define RING_NEXT(x,s) (((x)+1) & ((s)-1)) | 82 | #define RING_NEXT(x,s) (((x)+1) & ((s)-1)) |
86 | 83 | ||
87 | static const u32 default_msg = | 84 | static const u32 default_msg = |
@@ -2558,7 +2555,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) | |||
2558 | if (!(opcode & HW_OWNER)) | 2555 | if (!(opcode & HW_OWNER)) |
2559 | break; | 2556 | break; |
2560 | 2557 | ||
2561 | hw->st_idx = RING_NEXT(hw->st_idx, STATUS_RING_SIZE); | 2558 | hw->st_idx = RING_NEXT(hw->st_idx, hw->st_size); |
2562 | 2559 | ||
2563 | port = le->css & CSS_LINK_BIT; | 2560 | port = le->css & CSS_LINK_BIT; |
2564 | dev = hw->dev[port]; | 2561 | dev = hw->dev[port]; |
@@ -3198,7 +3195,7 @@ static void sky2_reset(struct sky2_hw *hw) | |||
3198 | for (i = 0; i < hw->ports; i++) | 3195 | for (i = 0; i < hw->ports; i++) |
3199 | sky2_gmac_reset(hw, i); | 3196 | sky2_gmac_reset(hw, i); |
3200 | 3197 | ||
3201 | memset(hw->st_le, 0, STATUS_LE_BYTES); | 3198 | memset(hw->st_le, 0, hw->st_size * sizeof(struct sky2_status_le)); |
3202 | hw->st_idx = 0; | 3199 | hw->st_idx = 0; |
3203 | 3200 | ||
3204 | sky2_write32(hw, STAT_CTRL, SC_STAT_RST_SET); | 3201 | sky2_write32(hw, STAT_CTRL, SC_STAT_RST_SET); |
@@ -3208,7 +3205,7 @@ static void sky2_reset(struct sky2_hw *hw) | |||
3208 | sky2_write32(hw, STAT_LIST_ADDR_HI, (u64) hw->st_dma >> 32); | 3205 | sky2_write32(hw, STAT_LIST_ADDR_HI, (u64) hw->st_dma >> 32); |
3209 | 3206 | ||
3210 | /* Set the list last index */ | 3207 | /* Set the list last index */ |
3211 | sky2_write16(hw, STAT_LAST_IDX, STATUS_RING_SIZE - 1); | 3208 | sky2_write16(hw, STAT_LAST_IDX, hw->st_size - 1); |
3212 | 3209 | ||
3213 | sky2_write16(hw, STAT_TX_IDX_TH, 10); | 3210 | sky2_write16(hw, STAT_TX_IDX_TH, 10); |
3214 | sky2_write8(hw, STAT_FIFO_WM, 16); | 3211 | sky2_write8(hw, STAT_FIFO_WM, 16); |
@@ -4256,12 +4253,13 @@ static int sky2_debug_show(struct seq_file *seq, void *v) | |||
4256 | napi_disable(&hw->napi); | 4253 | napi_disable(&hw->napi); |
4257 | last = sky2_read16(hw, STAT_PUT_IDX); | 4254 | last = sky2_read16(hw, STAT_PUT_IDX); |
4258 | 4255 | ||
4256 | seq_printf(seq, "Status ring %u\n", hw->st_size); | ||
4259 | if (hw->st_idx == last) | 4257 | if (hw->st_idx == last) |
4260 | seq_puts(seq, "Status ring (empty)\n"); | 4258 | seq_puts(seq, "Status ring (empty)\n"); |
4261 | else { | 4259 | else { |
4262 | seq_puts(seq, "Status ring\n"); | 4260 | seq_puts(seq, "Status ring\n"); |
4263 | for (idx = hw->st_idx; idx != last && idx < STATUS_RING_SIZE; | 4261 | for (idx = hw->st_idx; idx != last && idx < hw->st_size; |
4264 | idx = RING_NEXT(idx, STATUS_RING_SIZE)) { | 4262 | idx = RING_NEXT(idx, hw->st_size)) { |
4265 | const struct sky2_status_le *le = hw->st_le + idx; | 4263 | const struct sky2_status_le *le = hw->st_le + idx; |
4266 | seq_printf(seq, "[%d] %#x %d %#x\n", | 4264 | seq_printf(seq, "[%d] %#x %d %#x\n", |
4267 | idx, le->opcode, le->length, le->status); | 4265 | idx, le->opcode, le->length, le->status); |
@@ -4689,15 +4687,17 @@ static int __devinit sky2_probe(struct pci_dev *pdev, | |||
4689 | goto err_out_free_hw; | 4687 | goto err_out_free_hw; |
4690 | } | 4688 | } |
4691 | 4689 | ||
4692 | /* ring for status responses */ | ||
4693 | hw->st_le = pci_alloc_consistent(pdev, STATUS_LE_BYTES, &hw->st_dma); | ||
4694 | if (!hw->st_le) | ||
4695 | goto err_out_iounmap; | ||
4696 | |||
4697 | err = sky2_init(hw); | 4690 | err = sky2_init(hw); |
4698 | if (err) | 4691 | if (err) |
4699 | goto err_out_iounmap; | 4692 | goto err_out_iounmap; |
4700 | 4693 | ||
4694 | /* ring for status responses */ | ||
4695 | hw->st_size = hw->ports * roundup_pow_of_two(2*RX_MAX_PENDING + TX_MAX_PENDING); | ||
4696 | hw->st_le = pci_alloc_consistent(pdev, hw->st_size * sizeof(struct sky2_status_le), | ||
4697 | &hw->st_dma); | ||
4698 | if (!hw->st_le) | ||
4699 | goto err_out_reset; | ||
4700 | |||
4701 | dev_info(&pdev->dev, "Yukon-2 %s chip revision %d\n", | 4701 | dev_info(&pdev->dev, "Yukon-2 %s chip revision %d\n", |
4702 | sky2_name(hw->chip_id, buf1, sizeof(buf1)), hw->chip_rev); | 4702 | sky2_name(hw->chip_id, buf1, sizeof(buf1)), hw->chip_rev); |
4703 | 4703 | ||
@@ -4771,8 +4771,10 @@ err_out_unregister: | |||
4771 | err_out_free_netdev: | 4771 | err_out_free_netdev: |
4772 | free_netdev(dev); | 4772 | free_netdev(dev); |
4773 | err_out_free_pci: | 4773 | err_out_free_pci: |
4774 | pci_free_consistent(pdev, hw->st_size * sizeof(struct sky2_status_le), | ||
4775 | hw->st_le, hw->st_dma); | ||
4776 | err_out_reset: | ||
4774 | sky2_write8(hw, B0_CTST, CS_RST_SET); | 4777 | sky2_write8(hw, B0_CTST, CS_RST_SET); |
4775 | pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); | ||
4776 | err_out_iounmap: | 4778 | err_out_iounmap: |
4777 | iounmap(hw->regs); | 4779 | iounmap(hw->regs); |
4778 | err_out_free_hw: | 4780 | err_out_free_hw: |
@@ -4810,7 +4812,8 @@ static void __devexit sky2_remove(struct pci_dev *pdev) | |||
4810 | free_irq(pdev->irq, hw); | 4812 | free_irq(pdev->irq, hw); |
4811 | if (hw->flags & SKY2_HW_USE_MSI) | 4813 | if (hw->flags & SKY2_HW_USE_MSI) |
4812 | pci_disable_msi(pdev); | 4814 | pci_disable_msi(pdev); |
4813 | pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); | 4815 | pci_free_consistent(pdev, hw->st_size * sizeof(struct sky2_status_le), |
4816 | hw->st_le, hw->st_dma); | ||
4814 | pci_release_regions(pdev); | 4817 | pci_release_regions(pdev); |
4815 | pci_disable_device(pdev); | 4818 | pci_disable_device(pdev); |
4816 | 4819 | ||