bitkeeper revision 1.877 (408a2112twZvxfjh5flm0x6eryHUPw)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Sat, 24 Apr 2004 08:10:58 +0000 (08:10 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Sat, 24 Apr 2004 08:10:58 +0000 (08:10 +0000)
Fix crash in e100 rx routines. Also add diagnostic tracing for tx failures.

xen/drivers/net/e100/e100.h
xen/drivers/net/e100/e100_main.c

index 1c42fb5069033fdff5301f7cd7b5575b7d70b0d4..8503550d9cfdab1da26e2a4d50f59e0a760eb593 100644 (file)
@@ -484,7 +484,6 @@ typedef struct net_device_stats net_dev_stats_t;
 #define TCBS_AVAIL(X)     (NEXT_TCB_TOUSE( NEXT_TCB_TOUSE((X).tail)) != (X).head)
 
 #define RFD_POINTER(skb,bdp)      ((rfd_t *) (((unsigned char *)((skb)->data))-((bdp)->rfd_size)))
-#define SKB_RFD_STATUS(skb,bdp)   ((RFD_POINTER((skb),(bdp)))->rfd_header.cb_status)
 
 /* ====================================================================== */
 /*                              82557                                     */
@@ -977,6 +976,16 @@ extern unsigned char e100_configure_device(struct e100_private *bdp);
 extern unsigned char e100_cu_unknown_state(struct e100_private *bdp);
 #endif
 
+static inline u16 SKB_RFD_STATUS(struct sk_buff *skb, struct e100_private *bdp)
+{
+    u16    status;
+    rfd_t *rfd = RFD_POINTER(skb, bdp);
+    rfd = map_domain_mem(__pa(rfd));
+    status = rfd->rfd_header.cb_status;
+    unmap_domain_mem(rfd);
+    return status;
+}
+
 #define ROM_TEST_FAIL          0x01
 #define REGISTER_TEST_FAIL     0x02
 #define SELF_TEST_FAIL         0x04
index 300e0ad4d39469f034fdca756502273c0d6c839d..6ce4d87b8c520f3d9c8e6ff688086dd269f38849 100644 (file)
@@ -1092,6 +1092,7 @@ e100_xmit_frame(struct sk_buff *skb, struct net_device *dev)
        struct e100_private *bdp = dev->priv;
 
        if (!spin_trylock(&bdp->bd_non_tx_lock)) {
+               printk("Couldn't acqure lock in e100_xmit_frame\n");
                notify_stop = true;
                rc = 1;
                goto exit2;
@@ -1099,6 +1100,10 @@ e100_xmit_frame(struct sk_buff *skb, struct net_device *dev)
 
        if (!TCBS_AVAIL(bdp->tcb_pool) ||
            (bdp->non_tx_command_state != E100_NON_TX_IDLE)) {
+               printk("Bailing from e100_tx_frame %d, %d, %d\n",
+                       TCBS_AVAIL(bdp->tcb_pool),
+                       bdp->non_tx_command_state,
+                       E100_NON_TX_IDLE);
                notify_stop = true;
                rc = 1;
                goto exit1;