aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/sky2.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index 4f41a9445961..706884ae8fcd 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -2247,20 +2247,26 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
2247 do { 2247 do {
2248 struct sky2_port *sky2; 2248 struct sky2_port *sky2;
2249 struct sky2_status_le *le = hw->st_le + hw->st_idx; 2249 struct sky2_status_le *le = hw->st_le + hw->st_idx;
2250 unsigned port = le->css & CSS_LINK_BIT; 2250 unsigned port;
2251 struct net_device *dev; 2251 struct net_device *dev;
2252 struct sk_buff *skb; 2252 struct sk_buff *skb;
2253 u32 status; 2253 u32 status;
2254 u16 length; 2254 u16 length;
2255 u8 opcode = le->opcode;
2256
2257 if (!(opcode & HW_OWNER))
2258 break;
2255 2259
2256 hw->st_idx = RING_NEXT(hw->st_idx, STATUS_RING_SIZE); 2260 hw->st_idx = RING_NEXT(hw->st_idx, STATUS_RING_SIZE);
2257 2261
2262 port = le->css & CSS_LINK_BIT;
2258 dev = hw->dev[port]; 2263 dev = hw->dev[port];
2259 sky2 = netdev_priv(dev); 2264 sky2 = netdev_priv(dev);
2260 length = le16_to_cpu(le->length); 2265 length = le16_to_cpu(le->length);
2261 status = le32_to_cpu(le->status); 2266 status = le32_to_cpu(le->status);
2262 2267
2263 switch (le->opcode & ~HW_OWNER) { 2268 le->opcode = 0;
2269 switch (opcode & ~HW_OWNER) {
2264 case OP_RXSTAT: 2270 case OP_RXSTAT:
2265 ++rx[port]; 2271 ++rx[port];
2266 skb = sky2_receive(dev, length, status); 2272 skb = sky2_receive(dev, length, status);
@@ -2353,7 +2359,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
2353 default: 2359 default:
2354 if (net_ratelimit()) 2360 if (net_ratelimit())
2355 printk(KERN_WARNING PFX 2361 printk(KERN_WARNING PFX
2356 "unknown status opcode 0x%x\n", le->opcode); 2362 "unknown status opcode 0x%x\n", opcode);
2357 } 2363 }
2358 } while (hw->st_idx != idx); 2364 } while (hw->st_idx != idx);
2359 2365