kern/132001: [patch] ixgb update
Oleg
agile at sunbay.com
Mon Feb 23 02:50:01 PST 2009
>Number: 132001
>Category: kern
>Synopsis: [patch] ixgb update
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Mon Feb 23 10:50:00 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator: Oleg
>Release: FreeBSD 7.1 RELEASE
>Organization:
Sunbay
>Environment:
>Description:
First of all, need to update driver stored into src/sys/dev/ixgb/ with
fresh sources from Intel (ixgb-6.1.0.tar.gz):
http://downloadcenter.intel.com/Detail_Desc.aspx?ProductID=2245&DwnldID=10958&lang=eng
Next, apply this patch to make Intel driver compiled successfully into FreeBSD 7 environment.
>How-To-Repeat:
ixgb driver located in the trunk doesnt support cx4 adapter
>Fix:
Patch attached with submission follows:
diff -u -r ixgb-6.1.0/src/if_ixgb.c ixgb-6.1.0-patched/src/if_ixgb.c
--- ixgb-6.1.0/src/if_ixgb.c 2006-07-15 01:35:01.000000000 +0300
+++ ixgb-6.1.0-patched/src/if_ixgb.c 2009-01-16 17:06:41.000000000 +0200
@@ -665,8 +665,13 @@
ixgb_stop(adapter);
/* Get the latest mac address, User can use a LAA */
+#ifdef IFP2ENADDR
bcopy(IFP2ENADDR(adapter->ifp), adapter->hw.curr_mac_addr,
IXGB_ETH_LENGTH_OF_ADDRESS);
+#elif __FreeBSD_version >= 700000
+ bcopy(IF_LLADDR(adapter->ifp), adapter->hw.curr_mac_addr,
+ IXGB_ETH_LENGTH_OF_ADDRESS);
+#endif
/* Initialize the hardware */
if (ixgb_hardware_init(adapter)) {
@@ -928,7 +933,9 @@
u_int8_t txd_popts;
int i, j, error, nsegs;
+#if __FreeBSD_version <= 700022
struct m_tag *mtag;
+#endif
bus_dma_segment_t segs[IXGB_MAX_SCATTER];
bus_dmamap_t map;
struct ixgb_buffer *tx_buffer = NULL;
@@ -976,7 +983,10 @@
txd_popts = 0;
/* Find out if we are in vlan mode */
+#if __FreeBSD_version <= 700022
mtag = VLAN_OUTPUT_TAG(ifp, m_head);
+#endif
+
i = adapter->next_avail_tx_desc;
for (j = 0; j < nsegs; j++) {
tx_buffer = &adapter->tx_buffer_area[i];
@@ -993,7 +1003,13 @@
adapter->num_tx_desc_avail -= nsegs;
adapter->next_avail_tx_desc = i;
-
+#if __FreeBSD_version > 700022
+ if (m_head->m_flags & M_VLANTAG) {
+ current_tx_desc->cmd_type_len |= IXGB_TX_DESC_CMD_VLE;
+ current_tx_desc->vlan = m_head->m_pkthdr.ether_vtag;
+ } else
+ current_tx_desc->vlan = 0;
+#else
if (mtag != NULL) {
/* Set the vlan id */
current_tx_desc->vlan = VLAN_TAG_VALUE(mtag);
@@ -1001,6 +1017,7 @@
/* Tell hardware to add tag */
current_tx_desc->cmd_type_len |= IXGB_TX_DESC_CMD_VLE;
}
+#endif
tx_buffer->m_head = m_head;
tx_buffer->map = map;
bus_dmamap_sync(adapter->txtag, map, BUS_DMASYNC_PREWRITE);
@@ -1254,7 +1271,7 @@
}
if (bus_setup_intr(dev, adapter->res_interrupt,
INTR_TYPE_NET | INTR_MPSAFE,
- (void (*) (void *))ixgb_intr, adapter,
+ NULL, (void (*) (void *))ixgb_intr, adapter,
&adapter->int_handler_tag)) {
printf("ixgb%d: Error registering interrupt handler!\n",
adapter->unit);
@@ -2119,18 +2136,34 @@
ixgb_receive_checksum(adapter, current_desc,
adapter->fmp);
- if (current_desc->status & IXGB_RX_DESC_STATUS_VP)
+#if __FreeBSD_version < 700000
+ if (current_desc->status & IXGB_RX_DESC_STATUS_VP)
VLAN_INPUT_TAG(eh, adapter->fmp,
current_desc->special);
+#else
+ if (current_desc->status & IXGB_RX_DESC_STATUS_VP) {
+ adapter->fmp->m_pkthdr.ether_vtag =
+ current_desc->special;
+ adapter->fmp->m_flags |= M_VLANTAG;
+ }
+#endif
else
ether_input(ifp, eh, adapter->fmp);
#else
ixgb_receive_checksum(adapter, current_desc,
adapter->fmp);
+#if __FreeBSD_version < 700000
if (current_desc->status & IXGB_RX_DESC_STATUS_VP)
VLAN_INPUT_TAG(ifp, adapter->fmp,
current_desc->special,
adapter->fmp = NULL);
+#else
+ if (current_desc->status & IXGB_RX_DESC_STATUS_VP) {
+ adapter->fmp->m_pkthdr.ether_vtag =
+ current_desc->special;
+ adapter->fmp->m_flags |= M_VLANTAG;
+ }
+#endif
if (adapter->fmp != NULL) {
IXGB_UNLOCK(adapter);
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list