This patch fixes 64-bit bugs in c7000.c so the driver will work for
both 31-bit and 64-bit kernels.  This is the third of three patches.
Marcelo, please apply this patch.

diff -urN NEWERlinux-2.4.26/drivers/s390/net/c7000.c 
NEWESTlinux-2.4.26/drivers/s390/net/c7000.c
--- NEWERlinux-2.4.26/drivers/s390/net/c7000.c  2004-08-03 14:43:54.000000000 -0700
+++ NEWESTlinux-2.4.26/drivers/s390/net/c7000.c 2004-08-03 14:30:20.000000000 -0700
@@ -527,7 +527,7 @@
        ccw1_t                          ccws[5];        /* control ccws */
        int                             devno;          /* device number */
        int                             irq;            /* subchannel number */
-       int                             IO_active;      /* IO activity flag */
+       unsigned long                   IO_active;      /* IO activity flag */
        int                             state;          /* fsm state */
        int                             retries;        /* retry counter */
        unsigned long                   flag_a;         /* bh activity flag */
@@ -562,7 +562,7 @@
        unsigned char                   version;        /* version = 2 */
        unsigned char                   linkid;         /* link id */
        struct  c7000_unit              cunits[NUNITS]; /* embedded units */
-       int                             tbusy;
+       unsigned long                   tbusy;
 };

 /*
@@ -714,9 +714,9 @@
 static int
 c7000_haltio(struct c7000_unit *cup)
 {
-       __u32                   parm;
+       unsigned long           parm;
        __u8                    flags = 0x00;
-       __u32                   saveflags;
+       unsigned long           saveflags;
        DECLARE_WAITQUEUE(wait, current);
        int                     rc;

@@ -747,9 +747,9 @@
 static int
 c7000_doio(struct c7000_unit *cup)
 {
-       __u32                   parm;
+       unsigned long           parm;
        __u8                    flags = 0x00;
-       __u32                   saveflags;
+       unsigned long           saveflags;
        DECLARE_WAITQUEUE(wait, current);
        int                     rc;

@@ -985,9 +985,10 @@
                        bufptr = kmalloc(sizeof(struct c7000_buffer), GFP_KERNEL);
                        data = kmalloc(C7000_BUFSIZE, GFP_KERNEL);

-                       if (bufptr == NULL)
-                       {
-                               if(data)
+                       if (bufptr == NULL || data == NULL) {
+                               if (bufptr)
+                                       kfree(bufptr);
+                               if (data)
                                        kfree(data);
                                return(-1);
                        }
@@ -1286,9 +1287,9 @@
        struct  net_device              *dev;
        int                             rc;
        __u16                           data_length;
-       __u32                           parm;
+       unsigned long                   parm;
        __u8                            flags = 0x00;
-       __u32                           saveflags;
+       unsigned long                   saveflags;

        ccp = cup->cntlp;
        dev = ccp->dev;
@@ -1340,6 +1341,7 @@
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
                        netif_rx(skb);
                        ccp->stats.rx_packets++;
+                       ccp->stats.rx_bytes += skb->len;
                } else {
                        CPrintk(0, "c7000: c7000_irq_bh: can not allocate a skb for 
unit 0x%x\n", cup->devno);
                        ccp->stats.rx_dropped++;
@@ -1378,7 +1380,7 @@
                        return;
                }

-               parm = (__u32)cup;
+               parm = (unsigned long)cup;
                cup->state = C7000_READ;

                if ((rc = do_IO(cup->irq, &cup->proc_head->ccws[0], parm, 0xff, 
flags)) != 0) {
@@ -1953,7 +1955,7 @@
        struct  c7000_controller        *ccp = (struct c7000_controller *)dev->priv;
        struct  c7000_unit              *cup;
        int                             rc;
-       __u32                           parm;
+       unsigned long                   parm;
        __u8                            flags = 0x00;

        c7000_set_busy(dev);
@@ -2105,7 +2107,7 @@
        */

        cup->state = C7000_READ;
-       parm = (__u32) cup;
+       parm = (unsigned long)cup;
        set_bit(0, (void *)&cup->IO_active);

        if ((rc = do_IO(cup->irq, &cup->proc_head->ccws[0], parm, 0xff, flags)) != 0) {
@@ -2193,8 +2195,8 @@
 {
        struct  c7000_controller        *ccp = (struct c7000_controller *)dev->priv;
        struct  c7000_unit              *cup;
-       __u32                           saveflags;
-       __u32                           parm;
+       unsigned long                   saveflags;
+       unsigned long                   parm;
        __u8                            flags = 0x00;
        struct  c7000_buffer            *buf, *pbuf;
        int                             rc;
@@ -2292,7 +2294,7 @@
        if (test_and_set_bit(0, (void *)&cup->IO_active) == 0) {
                CPrintk(1, "c7000: c7000_xmit: start IO for unit 0x%x\n", cup->devno);
                c7000_bld_wrt_chain(cup);
-               parm = (__u32) cup;
+               parm = (unsigned long)cup;
                cup->state = C7000_WRITE;

                if ((rc = do_IO(cup->irq, &cup->proc_head->ccws[0], parm, 0xff, 
flags)) != 0) {
@@ -2403,7 +2405,7 @@
 c7000_retry_io(struct c7000_unit *cup)
 {
        int     rc;
-       __u32   parm;
+       unsigned long   parm;
        __u8    flags = 0x00;
        ccw1_t  *ccwp;

@@ -2414,7 +2416,7 @@
        }

        set_bit(0, (void *)&cup->IO_active);
-       parm = (__u32)cup;
+       parm = (unsigned long)cup;

        if (cup->state == C7000_READ || cup->state == C7000_WRITE)
                ccwp = &cup->proc_head->ccws[0];
@@ -2502,14 +2504,10 @@
                */

                buf = c7000_dequeue_buffer(cup);
+               ccp->stats.tx_bytes += buf->len;
+               ccp->stats.tx_packets++;
                c7000_release_buffer(cup, buf);
                num_write++;
-
-               /*
-                       Update transmitted packets statistic.
-               */
-
-               ccp->stats.tx_packets++;
        }

        CPrintk(1, "c7000: c7000_proc_wintr: %d buffers written for unit 0x%x\n", 
num_write, cup->devno);
@@ -2527,7 +2525,7 @@
        struct  c7000_unit              *cup = NULL;
        struct  c7000_controller        *ccp = NULL;
        struct  net_device              *dev = NULL;
-       __u32                           parm;
+       unsigned long                   parm;
        __u8                            flags = 0x00;
        int                             rc;

@@ -2560,14 +2558,14 @@
        ccp = cup->cntlp;

        if (ccp == NULL) {
-               CPrintk(0, "c7000: c7000_intr: c7000_cntlp pointer is NULL in 
c7000_unit structure 0x%x for unit 0x%x\n", (int)cup, cup->devno);
+               CPrintk(0, "c7000: c7000_intr: c7000_cntlp pointer is NULL in 
c7000_unit structure %p for unit 0x%x\n", cup, cup->devno);
                return;
        }

        dev = ccp->dev;

        if (dev == NULL) {
-               CPrintk(0, "c7000: c7000_intr: device pointer is NULL in 
c7000_controller structure 0x%x for unit 0x%x\n", (int)ccp, cup->devno);
+               CPrintk(0, "c7000: c7000_intr: device pointer is NULL in 
c7000_controller structure %p for unit 0x%x\n", ccp, cup->devno);
                return;
        }

@@ -2719,7 +2717,7 @@
                        if ((devstat->flag & DEVSTAT_FINAL_STATUS) &&
                            (cup->free != NULL)) {
                                c7000_bld_read_chain(cup);
-                               parm = (__u32)cup;
+                               parm = (unsigned long)cup;
                                set_bit(0, (void *)&cup->IO_active);

                                if ((rc = do_IO(cup->irq, &cup->proc_head->ccws[0], 
parm, 0xff, flags)) != 0) {
@@ -2776,7 +2774,7 @@

                        if (cup->proc_head != NULL) {
                                c7000_bld_wrt_chain(cup);
-                               parm = (__u32)cup;
+                               parm = (unsigned long)cup;
                                set_bit(0, (void *)&cup->IO_active);

                                if ((rc = do_IO(cup->irq, &cup->proc_head->ccws[0], 
parm, 0xff, flags)) != 0) {
@@ -2912,7 +2910,7 @@
         dev->addr_len = 0;
         dev->type = ARPHRD_SLIP;
         dev->tx_queue_len = C7000_TXQUEUE_LEN;
-       dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP;
+       dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP;
        dev->open = c7000_open;
        dev->stop = c7000_stop;
        dev->set_config = c7000_config;
@@ -2929,7 +2927,7 @@
                return(-ENOMEM);
        }

-       CPrintk(1, "c7000: c7000_init: allocated a c7000_controller structure at 
address 0x%x\n", (int)ccp);
+       CPrintk(1, "c7000: c7000_init: allocated a c7000_controller structure at 
address %p\n", ccp);
        memset(ccp, '\0', sizeof(struct c7000_controller));
        ccp->dev = dev;
        ccp->base_addr = dev->base_addr;
@@ -3216,7 +3214,7 @@
                                        free_irq(ccp->cunits[j].irq, 
&ccp->cunits[j].devstat);
                                }

-                               CPrintk(1, "c7000: clean_module: free a 
c7000_controller structure at address 0x%x\n", (int)ccp);
+                               CPrintk(1, "c7000: clean_module: free a 
c7000_controller structure at address %p\n", ccp);
                                kfree(ccp);
                        }

----------------------------------------------------------------------
For LINUX-390 subscribe / signoff / archive access instructions,
send email to [EMAIL PROTECTED] with the message: INFO LINUX-390 or visit
http://www.marist.edu/htbin/wlvindex?LINUX-390

Reply via email to