RDMA/cxgb4: "cookie" can stay in host endianness
authorPaul Bolle <pebolle@tiscali.nl>
Tue, 5 Feb 2013 20:51:30 +0000 (20:51 +0000)
committerRoland Dreier <roland@purestorage.com>
Thu, 14 Feb 2013 23:55:05 +0000 (15:55 -0800)
Work requests are passed between the host and the firmware with a
"cookie".  This cookie is swapped to big-endian when passed to the
firmware and back to host endianness on return.  This swapping seems
to be implemented incorrectly.  Moreover, the byte swapping triggers
GCC warnings on 32 bit:

    drivers/infiniband/hw/cxgb4/cm.c: In function ‘passive_ofld_conn_reply’:
    drivers/infiniband/hw/cxgb4/cm.c:2803:12: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
    drivers/infiniband/hw/cxgb4/cm.c: In function ‘send_fw_pass_open_req’:
    drivers/infiniband/hw/cxgb4/cm.c:2941:16: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
    [...]

But byte swapping isn't needed as the firmware doesn't actually touch
the cookie.  Dropping byte swapping makes the warnings go away too.

Signed-off-by: Paul Bolle <pebolle@tiscali.nl>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/cxgb4/cm.c

index dfca515..565bfb1 100644 (file)
@@ -2818,7 +2818,7 @@ static void passive_ofld_conn_reply(struct c4iw_dev *dev, struct sk_buff *skb,
        struct cpl_pass_accept_req *cpl;
        int ret;
 
-       rpl_skb = (__force struct sk_buff *)cpu_to_be64(req->cookie);
+       rpl_skb = (struct sk_buff *)(unsigned long)req->cookie;
        BUG_ON(!rpl_skb);
        if (req->retval) {
                PDBG("%s passive open failure %d\n", __func__, req->retval);
@@ -2962,7 +2962,7 @@ static void send_fw_pass_open_req(struct c4iw_dev *dev, struct sk_buff *skb,
         * TP will ignore any value > 0 for MSS index.
         */
        req->tcb.opt0 = cpu_to_be64(V_MSS_IDX(0xF));
-       req->cookie = (__force __u64) cpu_to_be64((u64)skb);
+       req->cookie = (unsigned long)skb;
 
        set_wr_txq(req_skb, CPL_PRIORITY_CONTROL, port_id);
        cxgb4_ofld_send(dev->rdev.lldi.ports[0], req_skb);