patches/nicdrv-08-gldv3.diff
changeset 1698 831894410112
parent 1190 780cf9969b38
--- a/patches/nicdrv-08-gldv3.diff	Sat Feb 21 17:20:51 2009 +0000
+++ b/patches/nicdrv-08-gldv3.diff	Sat Feb 21 21:13:55 2009 +0000
@@ -1,19 +1,123 @@
---- myk-2.6.0/gem.h.orig	Sat Feb  2 21:41:18 2008
-+++ myk-2.6.0/gem.h	Sat Mar 22 23:00:26 2008
-@@ -672,7 +672,15 @@
- int gem_pci_set_power_state(dev_info_t *, ddi_acc_handle_t, uint_t);
- int gem_pci_regs_map_setup(dev_info_t *, uint32_t, uint32_t,
- 	struct ddi_device_acc_attr *, caddr_t *, ddi_acc_handle_t *);
--#ifndef GEM_CONFIG_GLDv3
-+#ifdef GEM_CONFIG_GLDv3
-+#define	gem_getinfo	nulldev
-+#define	gem_open	NULL
-+#define	gem_close	NULL
-+#define	gem_wput	NULL
-+#define	gem_wsrv	NULL
-+#define	gem_rsrv	NULL
-+#define	gem_power	NULL
+--- em-2.4.0.orig/gem.h	2009-02-19 23:21:04.447918000 -0500
++++ em-2.4.0/gem.h	2009-02-19 23:57:50.777478000 -0500
+@@ -10,6 +10,9 @@
+ 
+ #ifdef GEM_CONFIG_GLDv3
+ #include <sys/mac.h>
++#ifndef MAC_VERSION
++#include <sys/mac_provider.h>
++#endif
+ #include <sys/mac_ether.h>
+ #else
+ #include <sys/gld.h>
+--- em-2.4.0.orig/gem.c	2009-02-19 23:21:04.447837000 -0500
++++ em-2.4.0/gem.c	2009-02-20 00:03:35.580587000 -0500
+@@ -4340,7 +4340,11 @@
+ static void		gem_mc_ioctl(void *, queue_t *, mblk_t *);
+ static boolean_t	gem_mc_getcapab(void *, mac_capab_t, void *);
+ 
++#ifdef _SYS_MAC_PROVIDER_H
++#define	GEM_M_CALLBACK_FLAGS	(MC_IOCTL | MC_GETCAPAB)
 +#else
- #define	gem_getinfo	gld_getinfo
- #define	gem_open	gld_open
- #define	gem_close	gld_close
+ #define	GEM_M_CALLBACK_FLAGS	(MC_RESOURCES | MC_IOCTL | MC_GETCAPAB)
++#endif
+ 
+ static mac_callbacks_t gem_m_callbacks = {
+ 	GEM_M_CALLBACK_FLAGS,
+@@ -4351,7 +4355,9 @@
+ 	gem_mc_multicst,
+ 	gem_mc_unicst,
+ 	gem_mc_tx,
++#ifndef _SYS_MAC_PROVIDER_H
+ 	gem_mc_resources,
++#endif
+ 	gem_mc_ioctl,
+ 	gem_mc_getcapab,
+ };
+@@ -4994,7 +5000,7 @@
+ 	}
+ #endif /* notyet */
+ }
+-
++#ifndef _SYS_MAC_PROVIDER_H
+ static void
+ gem_set_coalease(void *arg, time_t ticks, uint_t count)
+ {
+@@ -5034,7 +5040,7 @@
+ 	mutex_exit(&dp->xmitlock);
+ 	mutex_exit(&dp->intrlock);
+ }
+-
++#endif /* _SYS_MAC_PROVIDER_H */
+ static boolean_t
+ gem_mc_getcapab(void *arg, mac_capab_t cap, void *cap_data)
+ {
+@@ -5065,9 +5071,11 @@
+ 		ret = B_TRUE;
+ 		break;
+ 
++#ifndef _SYS_MAC_PROVIDER_H
+ 	case MAC_CAPAB_POLL:
+ 		ret = B_TRUE;
+ 		break;
++#endif
+ 	}
+ 	return (ret);
+ }
+@@ -5778,6 +5786,7 @@
+ 	mac_register_t		*macp = NULL;
+ #else
+ 	gld_mac_info_t		*macinfo;
++	void			*tmp;
+ #endif
+ 	int			ret;
+ 	int			unit;
+@@ -5849,6 +5858,18 @@
+ 	gc->gc_rx_buf_align = max(gc->gc_rx_buf_align, IOC_LINESIZE - 1); 
+ 	gc->gc_dma_attr_rxbuf.dma_attr_align = gc->gc_rx_buf_align + 1;
+ 
++	/* fix descriptor boundary for cache line size */
++	gc->gc_dma_attr_desc.dma_attr_align =
++	    max(gc->gc_dma_attr_desc.dma_attr_align, IOC_LINESIZE);
++
++#ifndef GEM_CONFIG_GLDv3
++	/* workaround: fix dma attribute for solaris bug */
++	gc->gc_dma_attr_txbuf.dma_attr_count_max =
++	    max(gc->gc_dma_attr_txbuf.dma_attr_count_max, PAGEOFFSET);
++	gc->gc_dma_attr_rxbuf.dma_attr_count_max =
++	    max(gc->gc_dma_attr_rxbuf.dma_attr_count_max, PAGEOFFSET);
++#endif
++
+ 	/* fix get_packet method */
+ 	if (gc->gc_get_packet == NULL) {
+ 		gc->gc_get_packet = &gem_get_packet_default;
+@@ -5971,11 +5992,16 @@
+ 	mac_free(macp);
+ 	macp = NULL;
+ #else
++	/* gld_register will corrupts driver_private */
++	tmp = ddi_get_driver_private(dip);
+ 	if (gld_register(dip,
+ 			(char *)ddi_driver_name(dip), macinfo) != DDI_SUCCESS) {
+ 		cmn_err(CE_WARN, "!%s: gld_register failed", dp->name);
++		ddi_set_driver_private(dip, tmp);
+ 		goto err_stop_mii;
+ 	}
++	/* restore driver private */
++	ddi_set_driver_private(dip, tmp);
+ #endif
+ 	if ((dp->misc_flag & GEM_NOINTR) == 0) {
+ #ifdef GEM_CONFIG_GLDv3
+--- bfe-2.6.1.orig/gem.c	2009-02-13 10:00:03.000000000 -0500
++++ bfe-2.6.1/gem.c	2009-02-20 00:11:05.696196250 -0500
+@@ -7637,8 +7637,8 @@
+ 		}
+ #else
+ 		if (ddi_add_intr(dip, 0, NULL, NULL,
+-		    (uint_t (*)(caddr_t))gem_intr,
+-		    (caddr_t)dp) != DDI_SUCCESS) {
++		    gld_intr,
++		    (caddr_t)macinfo) != DDI_SUCCESS) {
+ 			cmn_err(CE_WARN, "!%s: ddi_add_intr failed", dp->name);
+ 			goto err_unregister;
+ 		}