]> err.no Git - linux-2.6/blobdiff - drivers/net/cxgb3/cxgb3_offload.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[linux-2.6] / drivers / net / cxgb3 / cxgb3_offload.c
index 901c824bfe6d5bda0f8a9d85a97b00bc91c1bf50..c5b3de1bb45625a688ee7d020e723545284f0947 100644 (file)
@@ -207,6 +207,17 @@ static int cxgb_ulp_iscsi_ctl(struct adapter *adapter, unsigned int req,
                break;
        case ULP_ISCSI_SET_PARAMS:
                t3_write_reg(adapter, A_ULPRX_ISCSI_TAGMASK, uiip->tagmask);
+               /* set MaxRxData and MaxCoalesceSize to 16224 */
+               t3_write_reg(adapter, A_TP_PARA_REG2, 0x3f603f60);
+               /* program the ddp page sizes */
+               {
+                       int i;
+                       unsigned int val = 0;
+                       for (i = 0; i < 4; i++)
+                               val |= (uiip->pgsz_factor[i] & 0xF) << (8 * i);
+                       if (val)
+                               t3_write_reg(adapter, A_ULPRX_ISCSI_PSZ, val);
+               }
                break;
        default:
                ret = -EOPNOTSUPP;
@@ -303,6 +314,12 @@ static int cxgb_rdma_ctl(struct adapter *adapter, unsigned int req, void *data)
                spin_unlock_irq(&adapter->sge.reg_lock);
                break;
        }
+       case RDMA_GET_MIB: {
+               spin_lock(&adapter->stats_lock);
+               t3_tp_get_mib_stats(adapter, (struct tp_mib_stats *)data);
+               spin_unlock(&adapter->stats_lock);
+               break;
+       }
        default:
                ret = -EOPNOTSUPP;
        }
@@ -381,6 +398,7 @@ static int cxgb_offload_ctl(struct t3cdev *tdev, unsigned int req, void *data)
        case RDMA_CQ_DISABLE:
        case RDMA_CTRL_QP_SETUP:
        case RDMA_GET_MEM:
+       case RDMA_GET_MIB:
                if (!offload_running(adapter))
                        return -EAGAIN;
                return cxgb_rdma_ctl(adapter, req, data);
@@ -833,10 +851,26 @@ static int do_trace(struct t3cdev *dev, struct sk_buff *skb)
        return 0;
 }
 
+/*
+ * That skb would better have come from process_responses() where we abuse
+ * ->priority and ->csum to carry our data.  NB: if we get to per-arch
+ * ->csum, the things might get really interesting here.
+ */
+
+static inline u32 get_hwtid(struct sk_buff *skb)
+{
+       return ntohl((__force __be32)skb->priority) >> 8 & 0xfffff;
+}
+
+static inline u32 get_opcode(struct sk_buff *skb)
+{
+       return G_OPCODE(ntohl((__force __be32)skb->csum));
+}
+
 static int do_term(struct t3cdev *dev, struct sk_buff *skb)
 {
-       unsigned int hwtid = ntohl(skb->priority) >> 8 & 0xfffff;
-       unsigned int opcode = G_OPCODE(ntohl(skb->csum));
+       unsigned int hwtid = get_hwtid(skb);
+       unsigned int opcode = get_opcode(skb);
        struct t3c_tid_entry *t3c_tid;
 
        t3c_tid = lookup_tid(&(T3C_DATA(dev))->tid_maps, hwtid);
@@ -914,7 +948,7 @@ int process_rx(struct t3cdev *dev, struct sk_buff **skbs, int n)
 {
        while (n--) {
                struct sk_buff *skb = *skbs++;
-               unsigned int opcode = G_OPCODE(ntohl(skb->csum));
+               unsigned int opcode = get_opcode(skb);
                int ret = cpl_handlers[opcode] (dev, skb);
 
 #if VALIDATE_TID
@@ -1232,6 +1266,25 @@ static inline void unregister_tdev(struct t3cdev *tdev)
        mutex_unlock(&cxgb3_db_lock);
 }
 
+static inline int adap2type(struct adapter *adapter)
+{
+       int type = 0;
+
+       switch (adapter->params.rev) {
+       case T3_REV_A:
+               type = T3A;
+               break;
+       case T3_REV_B:
+       case T3_REV_B2:
+               type = T3B;
+               break;
+       case T3_REV_C:
+               type = T3C;
+               break;
+       }
+       return type;
+}
+
 void __devinit cxgb3_adapter_ofld(struct adapter *adapter)
 {
        struct t3cdev *tdev = &adapter->tdev;
@@ -1241,7 +1294,7 @@ void __devinit cxgb3_adapter_ofld(struct adapter *adapter)
        cxgb3_set_dummy_ops(tdev);
        tdev->send = t3_offload_tx;
        tdev->ctl = cxgb_offload_ctl;
-       tdev->type = adapter->params.rev == 0 ? T3A : T3B;
+       tdev->type = adap2type(adapter);
 
        register_tdev(tdev);
 }