diff options
Diffstat (limited to 'drivers/net/sky2.c')
-rw-r--r-- | drivers/net/sky2.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 4bb6ea13efdd..d9cce50cffd1 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -79,6 +79,8 @@ | |||
79 | #define NAPI_WEIGHT 64 | 79 | #define NAPI_WEIGHT 64 |
80 | #define PHY_RETRIES 1000 | 80 | #define PHY_RETRIES 1000 |
81 | 81 | ||
82 | #define RING_NEXT(x,s) (((x)+1) & ((s)-1)) | ||
83 | |||
82 | static const u32 default_msg = | 84 | static const u32 default_msg = |
83 | NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK | 85 | NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK |
84 | | NETIF_MSG_TIMER | NETIF_MSG_TX_ERR | NETIF_MSG_RX_ERR | 86 | | NETIF_MSG_TIMER | NETIF_MSG_TX_ERR | NETIF_MSG_RX_ERR |
@@ -719,7 +721,7 @@ static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2) | |||
719 | { | 721 | { |
720 | struct sky2_tx_le *le = sky2->tx_le + sky2->tx_prod; | 722 | struct sky2_tx_le *le = sky2->tx_le + sky2->tx_prod; |
721 | 723 | ||
722 | sky2->tx_prod = (sky2->tx_prod + 1) % TX_RING_SIZE; | 724 | sky2->tx_prod = RING_NEXT(sky2->tx_prod, TX_RING_SIZE); |
723 | return le; | 725 | return le; |
724 | } | 726 | } |
725 | 727 | ||
@@ -735,7 +737,7 @@ static inline void sky2_put_idx(struct sky2_hw *hw, unsigned q, u16 idx) | |||
735 | static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2) | 737 | static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2) |
736 | { | 738 | { |
737 | struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put; | 739 | struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put; |
738 | sky2->rx_put = (sky2->rx_put + 1) % RX_LE_SIZE; | 740 | sky2->rx_put = RING_NEXT(sky2->rx_put, RX_LE_SIZE); |
739 | return le; | 741 | return le; |
740 | } | 742 | } |
741 | 743 | ||
@@ -1078,7 +1080,7 @@ err_out: | |||
1078 | /* Modular subtraction in ring */ | 1080 | /* Modular subtraction in ring */ |
1079 | static inline int tx_dist(unsigned tail, unsigned head) | 1081 | static inline int tx_dist(unsigned tail, unsigned head) |
1080 | { | 1082 | { |
1081 | return (head - tail) % TX_RING_SIZE; | 1083 | return (head - tail) & (TX_RING_SIZE - 1); |
1082 | } | 1084 | } |
1083 | 1085 | ||
1084 | /* Number of list elements available for next tx */ | 1086 | /* Number of list elements available for next tx */ |
@@ -1255,7 +1257,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
1255 | le->opcode = OP_BUFFER | HW_OWNER; | 1257 | le->opcode = OP_BUFFER | HW_OWNER; |
1256 | 1258 | ||
1257 | fre = sky2->tx_ring | 1259 | fre = sky2->tx_ring |
1258 | + ((re - sky2->tx_ring) + i + 1) % TX_RING_SIZE; | 1260 | + RING_NEXT((re - sky2->tx_ring) + i, TX_RING_SIZE); |
1259 | pci_unmap_addr_set(fre, mapaddr, mapping); | 1261 | pci_unmap_addr_set(fre, mapaddr, mapping); |
1260 | } | 1262 | } |
1261 | 1263 | ||
@@ -1315,7 +1317,7 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done) | |||
1315 | 1317 | ||
1316 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 1318 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
1317 | struct tx_ring_info *fre; | 1319 | struct tx_ring_info *fre; |
1318 | fre = sky2->tx_ring + (put + i + 1) % TX_RING_SIZE; | 1320 | fre = sky2->tx_ring + RING_NEXT(put + i, TX_RING_SIZE); |
1319 | pci_unmap_page(pdev, pci_unmap_addr(fre, mapaddr), | 1321 | pci_unmap_page(pdev, pci_unmap_addr(fre, mapaddr), |
1320 | skb_shinfo(skb)->frags[i].size, | 1322 | skb_shinfo(skb)->frags[i].size, |
1321 | PCI_DMA_TODEVICE); | 1323 | PCI_DMA_TODEVICE); |
@@ -1876,7 +1878,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) | |||
1876 | break; | 1878 | break; |
1877 | opcode &= ~HW_OWNER; | 1879 | opcode &= ~HW_OWNER; |
1878 | 1880 | ||
1879 | hw->st_idx = (hw->st_idx + 1) % STATUS_RING_SIZE; | 1881 | hw->st_idx = RING_NEXT(hw->st_idx, STATUS_RING_SIZE); |
1880 | le->opcode = 0; | 1882 | le->opcode = 0; |
1881 | 1883 | ||
1882 | link = le->link; | 1884 | link = le->link; |