PERFORCE change 128225 for review

Kip Macy kmacy at FreeBSD.org
Sat Oct 27 20:33:35 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=128225

Change 128225 by kmacy at kmacy:storage:toestack on 2007/10/28 03:32:55

	fix offload path so that offload can actually be enabled
	disable offload by default until an outstanding bug with t3_offload_tx is fixed

Affected files ...

.. //depot/projects/toestack/sys/dev/cxgb/cxgb_l2t.h#5 edit
.. //depot/projects/toestack/sys/dev/cxgb/cxgb_main.c#11 edit
.. //depot/projects/toestack/sys/dev/cxgb/cxgb_multiq.c#7 edit
.. //depot/projects/toestack/sys/dev/cxgb/cxgb_offload.c#8 edit
.. //depot/projects/toestack/sys/dev/cxgb/t3cdev.h#3 edit
.. //depot/projects/toestack/sys/dev/cxgb/ulp/toecore/toedev.h#6 edit
.. //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#2 edit
.. //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_tom.c#2 edit

Differences ...

==== //depot/projects/toestack/sys/dev/cxgb/cxgb_l2t.h#5 (text+ko) ====

@@ -95,6 +95,9 @@
 typedef void (*arp_failure_handler_func)(struct t3cdev *dev,
 					 struct mbuf *m);
 
+typedef void (*opaque_arp_failure_handler_func)(void *dev,
+					 struct mbuf *m);
+
 /*
  * Callback stored in an skb to handle address resolution failure.
  */
@@ -108,11 +111,13 @@
 #define L2T_MBUF_CB(skb) ((struct l2t_mbuf_cb *)(skb)->cb)
 
 
-static __inline void set_arp_failure_handler(struct toe_mbuf *m,
+static __inline void set_arp_failure_handler(struct mbuf *m,
 					   arp_failure_handler_func hnd)
 {
-	m->m_toe.mt_arp_fail = hnd;
-	panic("implement me");
+	struct toe_mbuf *tm = (struct toe_mbuf *)m;
+	
+	tm->m_toe.mt_arp_fail = (opaque_arp_failure_handler_func)hnd;
+
 }
 
 /*

==== //depot/projects/toestack/sys/dev/cxgb/cxgb_main.c#11 (text+ko) ====

@@ -120,10 +120,7 @@
 static int cxgb_get_regs_len(void);
 static int offload_open(struct port_info *pi);
 static void touch_bars(device_t dev);
-
-#ifdef notyet
 static int offload_close(struct t3cdev *tdev);
-#endif
 
 static device_method_t cxgb_controller_methods[] = {
 	DEVMETHOD(device_probe,		cxgb_controller_probe),
@@ -206,7 +203,7 @@
  * The driver enables offload as a default.
  * To disable it, use ofld_disable = 1.
  */
-static int ofld_disable = 0;
+static int ofld_disable = 1;
 TUNABLE_INT("hw.cxgb.ofld_disable", &ofld_disable);
 SYSCTL_UINT(_hw_cxgb, OID_AUTO, ofld_disable, CTLFLAG_RDTUN, &ofld_disable, 0,
     "disable ULP offload");
@@ -694,14 +691,14 @@
 	bus_generic_detach(sc->dev);
 	if (sc->tq != NULL) 
 		taskqueue_free(sc->tq);
-#ifdef notyet
 	if (is_offload(sc)) {
 		cxgb_adapter_unofld(sc);
 		if (isset(&sc->open_device_map,	OFFLOAD_DEVMAP_BIT))
 			offload_close(&sc->tdev);
-	}
-#endif
-
+		else
+			printf("cxgb_free: DEVMAP_BIT not set\n");
+	} else
+		printf("not offloading set\n");	
 #ifndef IFNET_MULTIQUEUE
 	t3_free_sge_resources(sc);
 #endif
@@ -1039,7 +1036,7 @@
 
 	ether_ifdetach(p->ifp);
 	printf("waiting for callout to stop ...");
-	DELAY(100000);
+	DELAY(1000000);
 	printf("done\n");
 	/*
 	 * the lock may be acquired in ifdetach
@@ -1289,9 +1286,7 @@
 {
 	int ret;
 
-	critical_enter();
 	ret = t3_offload_tx(tdev, m);
-	critical_exit();
 	return (ret);
 }
 
@@ -1606,15 +1601,22 @@
 offload_open(struct port_info *pi)
 {
 	struct adapter *adapter = pi->adapter;
-	struct t3cdev *tdev = T3CDEV(pi->ifp);
+	struct t3cdev *tdev = &adapter->tdev;
+#ifdef notyet	
+	    T3CDEV(pi->ifp);
+#endif	
 	int adap_up = adapter->open_device_map & PORT_MASK;
 	int err = 0;
 
+	printf("device_map=0x%x\n", adapter->open_device_map); 
 	if (atomic_cmpset_int(&adapter->open_device_map,
-		(adapter->open_device_map & ~OFFLOAD_DEVMAP_BIT),
-		(adapter->open_device_map | OFFLOAD_DEVMAP_BIT)) == 0)
+		(adapter->open_device_map & ~(1<<OFFLOAD_DEVMAP_BIT)),
+		(adapter->open_device_map | (1<<OFFLOAD_DEVMAP_BIT))) == 0)
 		return (0);
 
+       
+	if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT)) 
+		printf("offload_open: DEVMAP_BIT did not get set 0x%x\n", adapter->open_device_map);
 	ADAPTER_LOCK(pi->adapter); 
 	if (!adap_up)
 		err = cxgb_up(adapter);
@@ -1623,7 +1625,7 @@
 		return (err);
 
 	t3_tp_set_offload_mode(adapter, 1);
-	tdev->lldev = adapter->port[0].ifp;
+	tdev->lldev = pi->ifp;
 	err = cxgb_offload_activate(adapter);
 	if (err)
 		goto out;
@@ -1647,15 +1649,18 @@
 	}
 	return (err);
 }
-#ifdef notyet
+
 static int
 offload_close(struct t3cdev *tdev)
 {
 	struct adapter *adapter = tdev2adap(tdev);
 
-	if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
+	if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT)) {
+		printf("offload_close: DEVMAP_BIT not set\n");
+	
 		return (0);
-
+	}
+	
 	/* Call back all registered clients */
 	cxgb_remove_clients(tdev);
 	tdev->lldev = NULL;
@@ -1663,13 +1668,15 @@
 	t3_tp_set_offload_mode(adapter, 0);
 	clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
 
+	ADAPTER_LOCK(adapter);
 	if (!adapter->open_device_map)
-		cxgb_down(adapter);
-
+		cxgb_down_locked(adapter);
+	else
+		ADAPTER_UNLOCK(adapter);
 	cxgb_offload_deactivate(adapter);
 	return (0);
 }
-#endif
+
 
 static void
 cxgb_init(void *arg)

==== //depot/projects/toestack/sys/dev/cxgb/cxgb_multiq.c#7 (text+ko) ====

@@ -629,7 +629,7 @@
 	t3_free_qset(qs->port->adapter, qs);
 
 	qs->qs_flags &= ~QS_RUNNING;
-	kthread_exit(0);
+	kproc_exit(0);
 }
 
 static int
@@ -663,7 +663,7 @@
 			qs->qs_cpuid = ((pi->first_qset + j) % mp_ncpus);
 			device_printf(sc->dev, "starting thread for %d\n", qs->qs_cpuid);
 
-			kthread_create(cxgb_pcpu_start_proc, qs, &p,
+			kproc_create(cxgb_pcpu_start_proc, qs, &p,
 			    RFNOWAIT, 0, "cxgbsp");
 			DELAY(200);
 		}

==== //depot/projects/toestack/sys/dev/cxgb/cxgb_offload.c#8 (text+ko) ====

@@ -1281,7 +1281,7 @@
 cxgb_alloc_mem(unsigned long size)
 {
 
-	return malloc(size, M_DEVBUF, M_ZERO);
+	return malloc(size, M_DEVBUF, M_ZERO|M_NOWAIT);
 }
 
 /*
@@ -1320,8 +1320,8 @@
 	t->afree = NULL;
 	t->stids_in_use = t->atids_in_use = 0;
 	atomic_set_int(&t->tids_in_use, 0);
-	mtx_init(&t->stid_lock, "stid", NULL, MTX_DEF);
-	mtx_init(&t->atid_lock, "atid", NULL, MTX_DEF);
+	mtx_init(&t->stid_lock, "stid", NULL, MTX_DUPOK|MTX_DEF);
+	mtx_init(&t->atid_lock, "atid", NULL, MTX_DUPOK|MTX_DEF);
 
 	/*
 	 * Setup the free lists for stid_tab and atid_tab.
@@ -1376,7 +1376,7 @@
 	struct mtutab mtutab;
 	unsigned int l2t_capacity;
 
-	t = malloc(sizeof(*t), M_DEVBUF, M_WAITOK);
+	t = malloc(sizeof(*t), M_DEVBUF, M_WAITOK|M_ZERO);
 	if (!t)
 		return (ENOMEM);
 
@@ -1386,25 +1386,32 @@
 	    dev->ctl(dev, GET_L2T_CAPACITY, &l2t_capacity) < 0 ||
 	    dev->ctl(dev, GET_MTUS, &mtutab) < 0 ||
 	    dev->ctl(dev, GET_TID_RANGE, &tid_range) < 0 ||
-	    dev->ctl(dev, GET_STID_RANGE, &stid_range) < 0)
+	    dev->ctl(dev, GET_STID_RANGE, &stid_range) < 0) {
+		device_printf(adapter->dev, "%s: dev->ctl check failed\n", __FUNCTION__);
 		goto out_free;
-
+	}
+      
 	err = (ENOMEM);
 	L2DATA(dev) = t3_init_l2t(l2t_capacity);
-	if (!L2DATA(dev))
+	if (!L2DATA(dev)) {
+		device_printf(adapter->dev, "%s: t3_init_l2t failed\n", __FUNCTION__);
 		goto out_free;
+	}
+	
 
 	natids = min(tid_range.num / 2, MAX_ATIDS);
 	err = init_tid_tabs(&t->tid_maps, tid_range.num, natids,
 			    stid_range.num, ATID_BASE, stid_range.base);
-	if (err)
+	if (err) {	
+		device_printf(adapter->dev, "%s: init_tid_tabs failed\n", __FUNCTION__);
 		goto out_free_l2t;
-
+	}
+	
 	t->mtus = mtutab.mtus;
 	t->nmtus = mtutab.size;
 
 	TASK_INIT(&t->tid_release_task, 0 /* XXX? */, t3_process_tid_release_list, dev);
-	mtx_init(&t->tid_release_lock, "tid release", NULL, MTX_DEF);
+	mtx_init(&t->tid_release_lock, "tid release", NULL, MTX_DUPOK|MTX_DEF);
 	t->dev = dev;
 
 	T3C_DATA (dev) = t;
@@ -1420,15 +1427,21 @@
 			log(LOG_ERR, "Unable to set offload capabilities\n");
 #endif
 	}
+	printf("adding adapter %p\n", adapter); 
 	add_adapter(adapter);
-	return 0;
+	device_printf(adapter->dev, "offload started\n");
+#if 0
+	printf("failing as test\n");
+	return (ENOMEM);
+#endif
+	return (0);
 
 out_free_l2t:
 	t3_free_l2t(L2DATA(dev));
 	L2DATA(dev) = NULL;
 out_free:
 	free(t, M_DEVBUF);
-	return err;
+	return (err);
 
 }
 
@@ -1438,6 +1451,7 @@
 	struct t3cdev *tdev = &adapter->tdev;
 	struct t3c_data *t = T3C_DATA(tdev);
 
+	printf("removing adapter %p\n", adapter);
 	remove_adapter(adapter);
 	if (TAILQ_EMPTY(&adapter_list)) {
 #if defined(CONFIG_CHELSIO_T3_MODULE)
@@ -1507,10 +1521,8 @@
 {
 	int i;
 
-	if (inited)
+	if (inited++)
 		return;
-	else
-		inited = 1;
 	
 	mtx_init(&cxgb_db_lock, "ofld db", NULL, MTX_DEF);
 	rw_init(&adapter_list_lock, "ofld adap list");
@@ -1554,12 +1566,10 @@
 void 
 cxgb_offload_exit(void)
 {
-	static int deinited = 0;
 
-	if (deinited)
+	if (--inited)
 		return;
 
-	deinited = 1;
 	mtx_destroy(&cxgb_db_lock);
 	rw_destroy(&adapter_list_lock);
 #if 0	

==== //depot/projects/toestack/sys/dev/cxgb/t3cdev.h#3 (text+ko) ====

@@ -4,7 +4,7 @@
 #define T3CNAMSIZ 16
 
 /* Get the t3cdev associated with an ifnet */
-#define T3CDEV(ifp) (struct t3cdev *)((ifp)->if_spare2)
+#define T3CDEV(ifp) (&(((struct port_info *)(ifp)->if_softc))->adapter->tdev)
 
 struct cxgb3_client;
 

==== //depot/projects/toestack/sys/dev/cxgb/ulp/toecore/toedev.h#6 (text+ko) ====

@@ -166,7 +166,7 @@
 struct toepcb;
 
 struct m_toe_ {
-	void		(*mt_arp_fail)(struct t3cdev *, struct mbuf *);
+	void		(*mt_arp_fail)(void *, struct mbuf *);
 	void		(*mt_backlog_rcv)(struct toepcb *, struct mbuf *);
 	int 		priority;
 	struct toepcb	*mt_toepcb;  

==== //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#2 (text+ko) ====

@@ -406,7 +406,7 @@
 	    
 	m = (struct toe_mbuf *)m_gethdr(MT_DATA, M_WAITOK);
 	m->m_toe.mt_toepcb = tp->t_toe;
-	set_arp_failure_handler(m, act_open_req_arp_failure);
+	set_arp_failure_handler((struct mbuf *)m, act_open_req_arp_failure);
 	
 	if ((err = init_offload_socket(so, tdev, atid, e, dst)))
 		return (err);

==== //depot/projects/toestack/sys/dev/cxgb/ulp/tom/cxgb_tom.c#2 (text+ko) ====

@@ -64,6 +64,7 @@
 #include <dev/cxgb/t3cdev.h>
 #include <dev/cxgb/common/cxgb_firmware_exports.h>
 #include <dev/cxgb/common/cxgb_tcb.h>
+#include <dev/cxgb/cxgb_include.h>
 #include <dev/cxgb/common/cxgb_ctl_defs.h>
 #include <dev/cxgb/common/cxgb_t3_cpl.h>
 #include <dev/cxgb/cxgb_offload.h>


More information about the p4-projects mailing list