1 | /* |
---|
2 | * gPXE driver for Intel eepro1000 ethernet cards |
---|
3 | * |
---|
4 | * Written by Marty Connor |
---|
5 | * |
---|
6 | * Copyright Entity Cyber, Inc. 2007 |
---|
7 | * |
---|
8 | * This software may be used and distributed according to the terms of |
---|
9 | * the GNU General Public License (GPL), incorporated herein by |
---|
10 | * reference. Drivers based on or derived from this code fall under |
---|
11 | * the GPL and must retain the authorship, copyright and license |
---|
12 | * notice. |
---|
13 | * |
---|
14 | */ |
---|
15 | |
---|
16 | /******************************************************************************* |
---|
17 | |
---|
18 | Intel PRO/1000 Linux driver |
---|
19 | Copyright(c) 1999 - 2006 Intel Corporation. |
---|
20 | |
---|
21 | This program is free software; you can redistribute it and/or modify it |
---|
22 | under the terms and conditions of the GNU General Public License, |
---|
23 | version 2, as published by the Free Software Foundation. |
---|
24 | |
---|
25 | This program is distributed in the hope it will be useful, but WITHOUT |
---|
26 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
---|
27 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
---|
28 | more details. |
---|
29 | |
---|
30 | You should have received a copy of the GNU General Public License along with |
---|
31 | this program; if not, write to the Free Software Foundation, Inc., |
---|
32 | 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. |
---|
33 | |
---|
34 | The full GNU General Public License is included in this distribution in |
---|
35 | the file called "COPYING". |
---|
36 | |
---|
37 | Contact Information: |
---|
38 | Linux NICS <linux.nics@intel.com> |
---|
39 | e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> |
---|
40 | Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
---|
41 | |
---|
42 | *******************************************************************************/ |
---|
43 | |
---|
44 | FILE_LICENCE ( GPL2_ONLY ); |
---|
45 | |
---|
46 | #include "e1000.h" |
---|
47 | |
---|
48 | /** |
---|
49 | * e1000_get_hw_control - get control of the h/w from f/w |
---|
50 | * |
---|
51 | * @v adapter e1000 private structure |
---|
52 | * |
---|
53 | * e1000_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit. |
---|
54 | * For ASF and Pass Through versions of f/w this means that |
---|
55 | * the driver is loaded. For AMT version (only with 82573) |
---|
56 | * of the f/w this means that the network i/f is open. |
---|
57 | * |
---|
58 | **/ |
---|
59 | static void |
---|
60 | e1000_get_hw_control ( struct e1000_adapter *adapter ) |
---|
61 | { |
---|
62 | uint32_t ctrl_ext; |
---|
63 | uint32_t swsm; |
---|
64 | |
---|
65 | DBG ( "e1000_get_hw_control\n" ); |
---|
66 | |
---|
67 | /* Let firmware know the driver has taken over */ |
---|
68 | switch (adapter->hw.mac_type) { |
---|
69 | case e1000_82573: |
---|
70 | swsm = E1000_READ_REG(&adapter->hw, SWSM); |
---|
71 | E1000_WRITE_REG(&adapter->hw, SWSM, |
---|
72 | swsm | E1000_SWSM_DRV_LOAD); |
---|
73 | break; |
---|
74 | case e1000_82571: |
---|
75 | case e1000_82572: |
---|
76 | case e1000_82576: |
---|
77 | case e1000_80003es2lan: |
---|
78 | case e1000_ich8lan: |
---|
79 | ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); |
---|
80 | E1000_WRITE_REG(&adapter->hw, CTRL_EXT, |
---|
81 | ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); |
---|
82 | break; |
---|
83 | default: |
---|
84 | break; |
---|
85 | } |
---|
86 | } |
---|
87 | |
---|
88 | /** |
---|
89 | * e1000_irq_enable - Enable default interrupt generation settings |
---|
90 | * |
---|
91 | * @v adapter e1000 private structure |
---|
92 | **/ |
---|
93 | static void |
---|
94 | e1000_irq_enable ( struct e1000_adapter *adapter ) |
---|
95 | { |
---|
96 | E1000_WRITE_REG ( &adapter->hw, IMS, IMS_ENABLE_MASK ); |
---|
97 | E1000_WRITE_FLUSH ( &adapter->hw ); |
---|
98 | } |
---|
99 | |
---|
100 | /** |
---|
101 | * e1000_irq_disable - Mask off interrupt generation on the NIC |
---|
102 | * |
---|
103 | * @v adapter e1000 private structure |
---|
104 | **/ |
---|
105 | static void |
---|
106 | e1000_irq_disable ( struct e1000_adapter *adapter ) |
---|
107 | { |
---|
108 | E1000_WRITE_REG ( &adapter->hw, IMC, ~0 ); |
---|
109 | E1000_WRITE_FLUSH ( &adapter->hw ); |
---|
110 | } |
---|
111 | |
---|
112 | /** |
---|
113 | * e1000_sw_init - Initialize general software structures (struct e1000_adapter) |
---|
114 | * |
---|
115 | * @v adapter e1000 private structure |
---|
116 | * |
---|
117 | * e1000_sw_init initializes the Adapter private data structure. |
---|
118 | * Fields are initialized based on PCI device information and |
---|
119 | * OS network device settings (MTU size). |
---|
120 | **/ |
---|
121 | static int |
---|
122 | e1000_sw_init ( struct e1000_adapter *adapter ) |
---|
123 | { |
---|
124 | struct e1000_hw *hw = &adapter->hw; |
---|
125 | struct pci_device *pdev = adapter->pdev; |
---|
126 | |
---|
127 | /* PCI config space info */ |
---|
128 | |
---|
129 | hw->vendor_id = pdev->vendor; |
---|
130 | hw->device_id = pdev->device; |
---|
131 | |
---|
132 | pci_read_config_word ( pdev, PCI_COMMAND, &hw->pci_cmd_word ); |
---|
133 | |
---|
134 | /* Disable Flow Control */ |
---|
135 | hw->fc = E1000_FC_NONE; |
---|
136 | |
---|
137 | adapter->eeprom_wol = 0; |
---|
138 | adapter->wol = adapter->eeprom_wol; |
---|
139 | adapter->en_mng_pt = 0; |
---|
140 | adapter->rx_int_delay = 0; |
---|
141 | adapter->rx_abs_int_delay = 0; |
---|
142 | |
---|
143 | adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE; |
---|
144 | adapter->rx_ps_bsize0 = E1000_RXBUFFER_128; |
---|
145 | hw->max_frame_size = MAXIMUM_ETHERNET_VLAN_SIZE + |
---|
146 | ENET_HEADER_SIZE + ETHERNET_FCS_SIZE; |
---|
147 | hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE; |
---|
148 | |
---|
149 | /* identify the MAC */ |
---|
150 | |
---|
151 | if ( e1000_set_mac_type ( hw ) ) { |
---|
152 | DBG ( "Unknown MAC Type\n" ); |
---|
153 | return -EIO; |
---|
154 | } |
---|
155 | |
---|
156 | switch ( hw->mac_type ) { |
---|
157 | default: |
---|
158 | break; |
---|
159 | case e1000_82541: |
---|
160 | case e1000_82547: |
---|
161 | case e1000_82541_rev_2: |
---|
162 | case e1000_82547_rev_2: |
---|
163 | hw->phy_init_script = 1; |
---|
164 | break; |
---|
165 | } |
---|
166 | |
---|
167 | e1000_set_media_type ( hw ); |
---|
168 | |
---|
169 | hw->autoneg = TRUE; |
---|
170 | hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT; |
---|
171 | hw->wait_autoneg_complete = TRUE; |
---|
172 | |
---|
173 | hw->tbi_compatibility_en = TRUE; |
---|
174 | hw->adaptive_ifs = TRUE; |
---|
175 | |
---|
176 | /* Copper options */ |
---|
177 | |
---|
178 | if ( hw->media_type == e1000_media_type_copper ) { |
---|
179 | hw->mdix = AUTO_ALL_MODES; |
---|
180 | hw->disable_polarity_correction = FALSE; |
---|
181 | hw->master_slave = E1000_MASTER_SLAVE; |
---|
182 | } |
---|
183 | |
---|
184 | e1000_irq_disable ( adapter ); |
---|
185 | |
---|
186 | return 0; |
---|
187 | } |
---|
188 | |
---|
189 | /** |
---|
190 | * e1000_setup_tx_resources - allocate Tx resources (Descriptors) |
---|
191 | * |
---|
192 | * @v adapter e1000 private structure |
---|
193 | * |
---|
194 | * @ret rc Returns 0 on success, negative on failure |
---|
195 | **/ |
---|
196 | static int |
---|
197 | e1000_setup_tx_resources ( struct e1000_adapter *adapter ) |
---|
198 | { |
---|
199 | DBG ( "e1000_setup_tx_resources\n" ); |
---|
200 | |
---|
201 | /* Allocate transmit descriptor ring memory. |
---|
202 | It must not cross a 64K boundary because of hardware errata #23 |
---|
203 | so we use malloc_dma() requesting a 128 byte block that is |
---|
204 | 128 byte aligned. This should guarantee that the memory |
---|
205 | allocated will not cross a 64K boundary, because 128 is an |
---|
206 | even multiple of 65536 ( 65536 / 128 == 512 ), so all possible |
---|
207 | allocations of 128 bytes on a 128 byte boundary will not |
---|
208 | cross 64K bytes. |
---|
209 | */ |
---|
210 | |
---|
211 | adapter->tx_base = |
---|
212 | malloc_dma ( adapter->tx_ring_size, adapter->tx_ring_size ); |
---|
213 | |
---|
214 | if ( ! adapter->tx_base ) { |
---|
215 | return -ENOMEM; |
---|
216 | } |
---|
217 | |
---|
218 | memset ( adapter->tx_base, 0, adapter->tx_ring_size ); |
---|
219 | |
---|
220 | DBG ( "adapter->tx_base = %#08lx\n", virt_to_bus ( adapter->tx_base ) ); |
---|
221 | |
---|
222 | return 0; |
---|
223 | } |
---|
224 | |
---|
225 | static void |
---|
226 | e1000_free_tx_resources ( struct e1000_adapter *adapter ) |
---|
227 | { |
---|
228 | DBG ( "e1000_free_tx_resources\n" ); |
---|
229 | |
---|
230 | free_dma ( adapter->tx_base, adapter->tx_ring_size ); |
---|
231 | } |
---|
232 | |
---|
233 | /** |
---|
234 | * e1000_configure_tx - Configure 8254x Transmit Unit after Reset |
---|
235 | * @adapter: board private structure |
---|
236 | * |
---|
237 | * Configure the Tx unit of the MAC after a reset. |
---|
238 | **/ |
---|
239 | static void |
---|
240 | e1000_configure_tx ( struct e1000_adapter *adapter ) |
---|
241 | { |
---|
242 | struct e1000_hw *hw = &adapter->hw; |
---|
243 | uint32_t tctl; |
---|
244 | uint32_t txdctl; |
---|
245 | |
---|
246 | DBG ( "e1000_configure_tx\n" ); |
---|
247 | |
---|
248 | E1000_WRITE_REG ( hw, TDBAH, 0 ); |
---|
249 | E1000_WRITE_REG ( hw, TDBAL, virt_to_bus ( adapter->tx_base ) ); |
---|
250 | E1000_WRITE_REG ( hw, TDLEN, adapter->tx_ring_size ); |
---|
251 | |
---|
252 | DBG ( "TDBAL: %#08x\n", E1000_READ_REG ( hw, TDBAL ) ); |
---|
253 | DBG ( "TDLEN: %d\n", E1000_READ_REG ( hw, TDLEN ) ); |
---|
254 | |
---|
255 | /* Setup the HW Tx Head and Tail descriptor pointers */ |
---|
256 | E1000_WRITE_REG ( hw, TDH, 0 ); |
---|
257 | E1000_WRITE_REG ( hw, TDT, 0 ); |
---|
258 | |
---|
259 | adapter->tx_head = 0; |
---|
260 | adapter->tx_tail = 0; |
---|
261 | adapter->tx_fill_ctr = 0; |
---|
262 | |
---|
263 | if (hw->mac_type == e1000_82576) { |
---|
264 | txdctl = E1000_READ_REG ( hw, TXDCTL ); |
---|
265 | txdctl |= E1000_TXDCTL_QUEUE_ENABLE; |
---|
266 | E1000_WRITE_REG ( hw, TXDCTL, txdctl ); |
---|
267 | } |
---|
268 | |
---|
269 | /* Setup Transmit Descriptor Settings for eop descriptor */ |
---|
270 | tctl = E1000_TCTL_PSP | E1000_TCTL_EN | |
---|
271 | (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT) | |
---|
272 | (E1000_HDX_COLLISION_DISTANCE << E1000_COLD_SHIFT); |
---|
273 | |
---|
274 | e1000_config_collision_dist ( hw ); |
---|
275 | |
---|
276 | E1000_WRITE_REG ( hw, TCTL, tctl ); |
---|
277 | E1000_WRITE_FLUSH ( hw ); |
---|
278 | } |
---|
279 | |
---|
280 | static void |
---|
281 | e1000_free_rx_resources ( struct e1000_adapter *adapter ) |
---|
282 | { |
---|
283 | int i; |
---|
284 | |
---|
285 | DBG ( "e1000_free_rx_resources\n" ); |
---|
286 | |
---|
287 | free_dma ( adapter->rx_base, adapter->rx_ring_size ); |
---|
288 | |
---|
289 | for ( i = 0; i < NUM_RX_DESC; i++ ) { |
---|
290 | free_iob ( adapter->rx_iobuf[i] ); |
---|
291 | } |
---|
292 | } |
---|
293 | |
---|
294 | /** |
---|
295 | * e1000_refill_rx_ring - allocate Rx io_buffers |
---|
296 | * |
---|
297 | * @v adapter e1000 private structure |
---|
298 | * |
---|
299 | * @ret rc Returns 0 on success, negative on failure |
---|
300 | **/ |
---|
301 | int e1000_refill_rx_ring ( struct e1000_adapter *adapter ) |
---|
302 | { |
---|
303 | int i, rx_curr; |
---|
304 | int rc = 0; |
---|
305 | struct e1000_rx_desc *rx_curr_desc; |
---|
306 | struct e1000_hw *hw = &adapter->hw; |
---|
307 | struct io_buffer *iob; |
---|
308 | |
---|
309 | DBG ("e1000_refill_rx_ring\n"); |
---|
310 | |
---|
311 | for ( i = 0; i < NUM_RX_DESC; i++ ) { |
---|
312 | rx_curr = ( ( adapter->rx_curr + i ) % NUM_RX_DESC ); |
---|
313 | rx_curr_desc = adapter->rx_base + rx_curr; |
---|
314 | |
---|
315 | if ( rx_curr_desc->status & E1000_RXD_STAT_DD ) |
---|
316 | continue; |
---|
317 | |
---|
318 | if ( adapter->rx_iobuf[rx_curr] != NULL ) |
---|
319 | continue; |
---|
320 | |
---|
321 | DBG2 ( "Refilling rx desc %d\n", rx_curr ); |
---|
322 | |
---|
323 | iob = alloc_iob ( MAXIMUM_ETHERNET_VLAN_SIZE ); |
---|
324 | adapter->rx_iobuf[rx_curr] = iob; |
---|
325 | |
---|
326 | if ( ! iob ) { |
---|
327 | DBG ( "alloc_iob failed\n" ); |
---|
328 | rc = -ENOMEM; |
---|
329 | break; |
---|
330 | } else { |
---|
331 | rx_curr_desc->buffer_addr = virt_to_bus ( iob->data ); |
---|
332 | |
---|
333 | E1000_WRITE_REG ( hw, RDT, rx_curr ); |
---|
334 | } |
---|
335 | } |
---|
336 | return rc; |
---|
337 | } |
---|
338 | |
---|
339 | /** |
---|
340 | * e1000_setup_rx_resources - allocate Rx resources (Descriptors) |
---|
341 | * |
---|
342 | * @v adapter e1000 private structure |
---|
343 | * |
---|
344 | * @ret rc Returns 0 on success, negative on failure |
---|
345 | **/ |
---|
346 | static int |
---|
347 | e1000_setup_rx_resources ( struct e1000_adapter *adapter ) |
---|
348 | { |
---|
349 | int i, rc = 0; |
---|
350 | |
---|
351 | DBG ( "e1000_setup_rx_resources\n" ); |
---|
352 | |
---|
353 | /* Allocate receive descriptor ring memory. |
---|
354 | It must not cross a 64K boundary because of hardware errata |
---|
355 | */ |
---|
356 | |
---|
357 | adapter->rx_base = |
---|
358 | malloc_dma ( adapter->rx_ring_size, adapter->rx_ring_size ); |
---|
359 | |
---|
360 | if ( ! adapter->rx_base ) { |
---|
361 | return -ENOMEM; |
---|
362 | } |
---|
363 | memset ( adapter->rx_base, 0, adapter->rx_ring_size ); |
---|
364 | |
---|
365 | for ( i = 0; i < NUM_RX_DESC; i++ ) { |
---|
366 | /* let e1000_refill_rx_ring() io_buffer allocations */ |
---|
367 | adapter->rx_iobuf[i] = NULL; |
---|
368 | } |
---|
369 | |
---|
370 | /* allocate io_buffers */ |
---|
371 | rc = e1000_refill_rx_ring ( adapter ); |
---|
372 | if ( rc < 0 ) |
---|
373 | e1000_free_rx_resources ( adapter ); |
---|
374 | |
---|
375 | return rc; |
---|
376 | } |
---|
377 | |
---|
378 | /** |
---|
379 | * e1000_configure_rx - Configure 8254x Receive Unit after Reset |
---|
380 | * @adapter: board private structure |
---|
381 | * |
---|
382 | * Configure the Rx unit of the MAC after a reset. |
---|
383 | **/ |
---|
384 | static void |
---|
385 | e1000_configure_rx ( struct e1000_adapter *adapter ) |
---|
386 | { |
---|
387 | struct e1000_hw *hw = &adapter->hw; |
---|
388 | uint32_t rctl, rxdctl, mrqc, rxcsum; |
---|
389 | |
---|
390 | DBG ( "e1000_configure_rx\n" ); |
---|
391 | |
---|
392 | /* disable receives while setting up the descriptors */ |
---|
393 | rctl = E1000_READ_REG ( hw, RCTL ); |
---|
394 | E1000_WRITE_REG ( hw, RCTL, rctl & ~E1000_RCTL_EN ); |
---|
395 | E1000_WRITE_FLUSH ( hw ); |
---|
396 | mdelay(10); |
---|
397 | |
---|
398 | adapter->rx_curr = 0; |
---|
399 | |
---|
400 | /* Setup the HW Rx Head and Tail Descriptor Pointers and |
---|
401 | * the Base and Length of the Rx Descriptor Ring */ |
---|
402 | |
---|
403 | E1000_WRITE_REG ( hw, RDBAL, virt_to_bus ( adapter->rx_base ) ); |
---|
404 | E1000_WRITE_REG ( hw, RDBAH, 0 ); |
---|
405 | E1000_WRITE_REG ( hw, RDLEN, adapter->rx_ring_size ); |
---|
406 | |
---|
407 | E1000_WRITE_REG ( hw, RDH, 0 ); |
---|
408 | if (hw->mac_type == e1000_82576) |
---|
409 | E1000_WRITE_REG ( hw, RDT, 0 ); |
---|
410 | else |
---|
411 | E1000_WRITE_REG ( hw, RDT, NUM_RX_DESC - 1 ); |
---|
412 | |
---|
413 | /* This doesn't seem to be necessary for correct operation, |
---|
414 | * but it seems as well to be implicit |
---|
415 | */ |
---|
416 | if (hw->mac_type == e1000_82576) { |
---|
417 | rxdctl = E1000_READ_REG ( hw, RXDCTL ); |
---|
418 | rxdctl |= E1000_RXDCTL_QUEUE_ENABLE; |
---|
419 | rxdctl &= 0xFFF00000; |
---|
420 | rxdctl |= IGB_RX_PTHRESH; |
---|
421 | rxdctl |= IGB_RX_HTHRESH << 8; |
---|
422 | rxdctl |= IGB_RX_WTHRESH << 16; |
---|
423 | E1000_WRITE_REG ( hw, RXDCTL, rxdctl ); |
---|
424 | E1000_WRITE_FLUSH ( hw ); |
---|
425 | |
---|
426 | rxcsum = E1000_READ_REG(hw, RXCSUM); |
---|
427 | rxcsum &= ~( E1000_RXCSUM_TUOFL | E1000_RXCSUM_IPPCSE ); |
---|
428 | E1000_WRITE_REG ( hw, RXCSUM, 0 ); |
---|
429 | |
---|
430 | /* The initial value for MRQC disables multiple receive |
---|
431 | * queues, however this setting is not recommended. |
---|
432 | * - Intel® 82576 Gigabit Ethernet Controller Datasheet r2.41 |
---|
433 | * Section 8.10.9 Multiple Queues Command Register - MRQC |
---|
434 | */ |
---|
435 | mrqc = E1000_MRQC_ENABLE_VMDQ; |
---|
436 | E1000_WRITE_REG ( hw, MRQC, mrqc ); |
---|
437 | } |
---|
438 | |
---|
439 | /* Enable Receives */ |
---|
440 | rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 | |
---|
441 | E1000_RCTL_MPE; |
---|
442 | E1000_WRITE_REG ( hw, RCTL, rctl ); |
---|
443 | E1000_WRITE_FLUSH ( hw ); |
---|
444 | |
---|
445 | /* On the 82576, RDT([0]) must not be "bumped" before |
---|
446 | * the enable bit of RXDCTL([0]) is set. |
---|
447 | * - Intel® 82576 Gigabit Ethernet Controller Datasheet r2.41 |
---|
448 | * Section 4.5.9 receive Initialization |
---|
449 | * |
---|
450 | * By observation I have found to occur when the enable bit of |
---|
451 | * RCTL is set. The datasheet recommends polling for this bit, |
---|
452 | * however as I see no evidence of this in the Linux igb driver |
---|
453 | * I have omitted that step. |
---|
454 | * - Simon Horman, May 2009 |
---|
455 | */ |
---|
456 | if (hw->mac_type == e1000_82576) |
---|
457 | E1000_WRITE_REG ( hw, RDT, NUM_RX_DESC - 1 ); |
---|
458 | |
---|
459 | DBG ( "RDBAL: %#08x\n", E1000_READ_REG ( hw, RDBAL ) ); |
---|
460 | DBG ( "RDLEN: %d\n", E1000_READ_REG ( hw, RDLEN ) ); |
---|
461 | DBG ( "RCTL: %#08x\n", E1000_READ_REG ( hw, RCTL ) ); |
---|
462 | } |
---|
463 | |
---|
464 | /** |
---|
465 | * e1000_reset - Put e1000 NIC in known initial state |
---|
466 | * |
---|
467 | * @v adapter e1000 private structure |
---|
468 | **/ |
---|
469 | static void |
---|
470 | e1000_reset ( struct e1000_adapter *adapter ) |
---|
471 | { |
---|
472 | uint32_t pba = 0; |
---|
473 | uint16_t fc_high_water_mark = E1000_FC_HIGH_DIFF; |
---|
474 | |
---|
475 | DBG ( "e1000_reset\n" ); |
---|
476 | |
---|
477 | switch (adapter->hw.mac_type) { |
---|
478 | case e1000_82542_rev2_0: |
---|
479 | case e1000_82542_rev2_1: |
---|
480 | case e1000_82543: |
---|
481 | case e1000_82544: |
---|
482 | case e1000_82540: |
---|
483 | case e1000_82541: |
---|
484 | case e1000_82541_rev_2: |
---|
485 | pba = E1000_PBA_48K; |
---|
486 | break; |
---|
487 | case e1000_82545: |
---|
488 | case e1000_82545_rev_3: |
---|
489 | case e1000_82546: |
---|
490 | case e1000_82546_rev_3: |
---|
491 | pba = E1000_PBA_48K; |
---|
492 | break; |
---|
493 | case e1000_82547: |
---|
494 | case e1000_82547_rev_2: |
---|
495 | pba = E1000_PBA_30K; |
---|
496 | break; |
---|
497 | case e1000_82571: |
---|
498 | case e1000_82572: |
---|
499 | case e1000_80003es2lan: |
---|
500 | pba = E1000_PBA_38K; |
---|
501 | break; |
---|
502 | case e1000_82573: |
---|
503 | pba = E1000_PBA_20K; |
---|
504 | break; |
---|
505 | case e1000_82576: |
---|
506 | pba = E1000_PBA_64K; |
---|
507 | break; |
---|
508 | case e1000_ich8lan: |
---|
509 | pba = E1000_PBA_8K; |
---|
510 | case e1000_undefined: |
---|
511 | case e1000_num_macs: |
---|
512 | break; |
---|
513 | } |
---|
514 | |
---|
515 | E1000_WRITE_REG ( &adapter->hw, PBA, pba ); |
---|
516 | |
---|
517 | /* flow control settings */ |
---|
518 | /* Set the FC high water mark to 90% of the FIFO size. |
---|
519 | * Required to clear last 3 LSB */ |
---|
520 | fc_high_water_mark = ((pba * 9216)/10) & 0xFFF8; |
---|
521 | |
---|
522 | /* We can't use 90% on small FIFOs because the remainder |
---|
523 | * would be less than 1 full frame. In this case, we size |
---|
524 | * it to allow at least a full frame above the high water |
---|
525 | * mark. */ |
---|
526 | if (pba < E1000_PBA_16K) |
---|
527 | fc_high_water_mark = (pba * 1024) - 1600; |
---|
528 | |
---|
529 | /* This actually applies to < e1000_82575, one revision less than |
---|
530 | * e1000_82576, but e1000_82575 isn't currently defined in the code */ |
---|
531 | if (adapter->hw.mac_type < e1000_82576) { |
---|
532 | /* 8-byte granularity */ |
---|
533 | adapter->hw.fc_high_water = fc_high_water_mark & 0xFFF8; |
---|
534 | adapter->hw.fc_low_water = adapter->hw.fc_high_water - 8; |
---|
535 | } else { |
---|
536 | /* 16-byte granularity */ |
---|
537 | adapter->hw.fc_high_water = fc_high_water_mark & 0xFFF0; |
---|
538 | adapter->hw.fc_low_water = adapter->hw.fc_high_water - 16; |
---|
539 | } |
---|
540 | |
---|
541 | if (adapter->hw.mac_type == e1000_80003es2lan || |
---|
542 | adapter->hw.mac_type == e1000_82576) |
---|
543 | adapter->hw.fc_pause_time = 0xFFFF; |
---|
544 | else |
---|
545 | adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME; |
---|
546 | adapter->hw.fc_send_xon = 1; |
---|
547 | adapter->hw.fc = adapter->hw.original_fc; |
---|
548 | /* Allow time for pending master requests to run */ |
---|
549 | |
---|
550 | e1000_reset_hw ( &adapter->hw ); |
---|
551 | |
---|
552 | if ( adapter->hw.mac_type >= e1000_82544 ) |
---|
553 | E1000_WRITE_REG ( &adapter->hw, WUC, 0 ); |
---|
554 | |
---|
555 | if ( e1000_init_hw ( &adapter->hw ) ) |
---|
556 | DBG ( "Hardware Error\n" ); |
---|
557 | |
---|
558 | /* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */ |
---|
559 | if (adapter->hw.mac_type >= e1000_82544 && |
---|
560 | adapter->hw.mac_type <= e1000_82547_rev_2 && |
---|
561 | adapter->hw.autoneg == 1 && |
---|
562 | adapter->hw.autoneg_advertised == ADVERTISE_1000_FULL) { |
---|
563 | uint32_t ctrl = E1000_READ_REG(&adapter->hw, CTRL); |
---|
564 | /* clear phy power management bit if we are in gig only mode, |
---|
565 | * which if enabled will attempt negotiation to 100Mb, which |
---|
566 | * can cause a loss of link at power off or driver unload */ |
---|
567 | ctrl &= ~E1000_CTRL_SWDPIN3; |
---|
568 | E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); |
---|
569 | } |
---|
570 | |
---|
571 | e1000_phy_get_info ( &adapter->hw, &adapter->phy_info ); |
---|
572 | |
---|
573 | if (!adapter->smart_power_down && |
---|
574 | (adapter->hw.mac_type == e1000_82571 || |
---|
575 | adapter->hw.mac_type == e1000_82572)) { |
---|
576 | uint16_t phy_data = 0; |
---|
577 | /* speed up time to link by disabling smart power down, ignore |
---|
578 | * the return value of this function because there is nothing |
---|
579 | * different we would do if it failed */ |
---|
580 | e1000_read_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT, |
---|
581 | &phy_data); |
---|
582 | phy_data &= ~IGP02E1000_PM_SPD; |
---|
583 | e1000_write_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT, |
---|
584 | phy_data); |
---|
585 | } |
---|
586 | } |
---|
587 | |
---|
588 | /** Functions that implement the gPXE driver API **/ |
---|
589 | |
---|
590 | /** |
---|
591 | * e1000_close - Disables a network interface |
---|
592 | * |
---|
593 | * @v netdev network interface device structure |
---|
594 | * |
---|
595 | **/ |
---|
596 | static void |
---|
597 | e1000_close ( struct net_device *netdev ) |
---|
598 | { |
---|
599 | struct e1000_adapter *adapter = netdev_priv ( netdev ); |
---|
600 | struct e1000_hw *hw = &adapter->hw; |
---|
601 | uint32_t rctl; |
---|
602 | uint32_t icr; |
---|
603 | |
---|
604 | DBG ( "e1000_close\n" ); |
---|
605 | |
---|
606 | /* Acknowledge interrupts */ |
---|
607 | icr = E1000_READ_REG ( hw, ICR ); |
---|
608 | |
---|
609 | e1000_irq_disable ( adapter ); |
---|
610 | |
---|
611 | /* disable receives */ |
---|
612 | rctl = E1000_READ_REG ( hw, RCTL ); |
---|
613 | E1000_WRITE_REG ( hw, RCTL, rctl & ~E1000_RCTL_EN ); |
---|
614 | E1000_WRITE_FLUSH ( hw ); |
---|
615 | |
---|
616 | e1000_reset_hw ( hw ); |
---|
617 | |
---|
618 | e1000_free_tx_resources ( adapter ); |
---|
619 | e1000_free_rx_resources ( adapter ); |
---|
620 | } |
---|
621 | |
---|
622 | /** |
---|
623 | * e1000_transmit - Transmit a packet |
---|
624 | * |
---|
625 | * @v netdev Network device |
---|
626 | * @v iobuf I/O buffer |
---|
627 | * |
---|
628 | * @ret rc Returns 0 on success, negative on failure |
---|
629 | */ |
---|
630 | static int |
---|
631 | e1000_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) |
---|
632 | { |
---|
633 | struct e1000_adapter *adapter = netdev_priv( netdev ); |
---|
634 | struct e1000_hw *hw = &adapter->hw; |
---|
635 | uint32_t tx_curr = adapter->tx_tail; |
---|
636 | struct e1000_tx_desc *tx_curr_desc; |
---|
637 | |
---|
638 | DBG ("e1000_transmit\n"); |
---|
639 | |
---|
640 | if ( adapter->tx_fill_ctr == NUM_TX_DESC ) { |
---|
641 | DBG ("TX overflow\n"); |
---|
642 | return -ENOBUFS; |
---|
643 | } |
---|
644 | |
---|
645 | /* Save pointer to iobuf we have been given to transmit, |
---|
646 | netdev_tx_complete() will need it later |
---|
647 | */ |
---|
648 | adapter->tx_iobuf[tx_curr] = iobuf; |
---|
649 | |
---|
650 | tx_curr_desc = ( void * ) ( adapter->tx_base ) + |
---|
651 | ( tx_curr * sizeof ( *adapter->tx_base ) ); |
---|
652 | |
---|
653 | DBG ( "tx_curr_desc = %#08lx\n", virt_to_bus ( tx_curr_desc ) ); |
---|
654 | DBG ( "tx_curr_desc + 16 = %#08lx\n", virt_to_bus ( tx_curr_desc ) + 16 ); |
---|
655 | DBG ( "iobuf->data = %#08lx\n", virt_to_bus ( iobuf->data ) ); |
---|
656 | |
---|
657 | /* Add the packet to TX ring |
---|
658 | */ |
---|
659 | tx_curr_desc->buffer_addr = |
---|
660 | virt_to_bus ( iobuf->data ); |
---|
661 | tx_curr_desc->lower.data = |
---|
662 | E1000_TXD_CMD_RPS | E1000_TXD_CMD_EOP | |
---|
663 | E1000_TXD_CMD_IFCS | iob_len ( iobuf ); |
---|
664 | tx_curr_desc->upper.data = 0; |
---|
665 | |
---|
666 | DBG ( "TX fill: %d tx_curr: %d addr: %#08lx len: %zd\n", adapter->tx_fill_ctr, |
---|
667 | tx_curr, virt_to_bus ( iobuf->data ), iob_len ( iobuf ) ); |
---|
668 | |
---|
669 | /* Point to next free descriptor */ |
---|
670 | adapter->tx_tail = ( adapter->tx_tail + 1 ) % NUM_TX_DESC; |
---|
671 | adapter->tx_fill_ctr++; |
---|
672 | |
---|
673 | /* Write new tail to NIC, making packet available for transmit |
---|
674 | */ |
---|
675 | wmb(); |
---|
676 | E1000_WRITE_REG ( hw, TDT, adapter->tx_tail ); |
---|
677 | |
---|
678 | return 0; |
---|
679 | } |
---|
680 | |
---|
681 | /** |
---|
682 | * e1000_poll - Poll for received packets |
---|
683 | * |
---|
684 | * @v netdev Network device |
---|
685 | */ |
---|
686 | static void |
---|
687 | e1000_poll ( struct net_device *netdev ) |
---|
688 | { |
---|
689 | struct e1000_adapter *adapter = netdev_priv( netdev ); |
---|
690 | struct e1000_hw *hw = &adapter->hw; |
---|
691 | |
---|
692 | uint32_t icr; |
---|
693 | uint32_t tx_status; |
---|
694 | uint32_t rx_status; |
---|
695 | uint32_t rx_len; |
---|
696 | uint32_t rx_err; |
---|
697 | struct e1000_tx_desc *tx_curr_desc; |
---|
698 | struct e1000_rx_desc *rx_curr_desc; |
---|
699 | uint32_t i; |
---|
700 | |
---|
701 | DBGP ( "e1000_poll\n" ); |
---|
702 | |
---|
703 | /* Acknowledge interrupts */ |
---|
704 | icr = E1000_READ_REG ( hw, ICR ); |
---|
705 | if ( ! icr ) |
---|
706 | return; |
---|
707 | |
---|
708 | DBG ( "e1000_poll: intr_status = %#08x\n", icr ); |
---|
709 | |
---|
710 | /* Check status of transmitted packets |
---|
711 | */ |
---|
712 | while ( ( i = adapter->tx_head ) != adapter->tx_tail ) { |
---|
713 | |
---|
714 | tx_curr_desc = ( void * ) ( adapter->tx_base ) + |
---|
715 | ( i * sizeof ( *adapter->tx_base ) ); |
---|
716 | |
---|
717 | tx_status = tx_curr_desc->upper.data; |
---|
718 | |
---|
719 | /* if the packet at tx_head is not owned by hardware it is for us */ |
---|
720 | if ( ! ( tx_status & E1000_TXD_STAT_DD ) ) |
---|
721 | break; |
---|
722 | |
---|
723 | DBG ( "Sent packet. tx_head: %d tx_tail: %d tx_status: %#08x\n", |
---|
724 | adapter->tx_head, adapter->tx_tail, tx_status ); |
---|
725 | |
---|
726 | if ( tx_status & ( E1000_TXD_STAT_EC | E1000_TXD_STAT_LC | |
---|
727 | E1000_TXD_STAT_TU ) ) { |
---|
728 | netdev_tx_complete_err ( netdev, adapter->tx_iobuf[i], -EINVAL ); |
---|
729 | DBG ( "Error transmitting packet, tx_status: %#08x\n", |
---|
730 | tx_status ); |
---|
731 | } else { |
---|
732 | netdev_tx_complete ( netdev, adapter->tx_iobuf[i] ); |
---|
733 | DBG ( "Success transmitting packet, tx_status: %#08x\n", |
---|
734 | tx_status ); |
---|
735 | } |
---|
736 | |
---|
737 | /* Decrement count of used descriptors, clear this descriptor |
---|
738 | */ |
---|
739 | adapter->tx_fill_ctr--; |
---|
740 | memset ( tx_curr_desc, 0, sizeof ( *tx_curr_desc ) ); |
---|
741 | |
---|
742 | adapter->tx_head = ( adapter->tx_head + 1 ) % NUM_TX_DESC; |
---|
743 | } |
---|
744 | |
---|
745 | /* Process received packets |
---|
746 | */ |
---|
747 | while ( 1 ) { |
---|
748 | |
---|
749 | i = adapter->rx_curr; |
---|
750 | |
---|
751 | rx_curr_desc = ( void * ) ( adapter->rx_base ) + |
---|
752 | ( i * sizeof ( *adapter->rx_base ) ); |
---|
753 | rx_status = rx_curr_desc->status; |
---|
754 | |
---|
755 | DBG2 ( "Before DD Check RX_status: %#08x\n", rx_status ); |
---|
756 | |
---|
757 | if ( ! ( rx_status & E1000_RXD_STAT_DD ) ) |
---|
758 | break; |
---|
759 | |
---|
760 | if ( adapter->rx_iobuf[i] == NULL ) |
---|
761 | break; |
---|
762 | |
---|
763 | DBG ( "RCTL = %#08x\n", E1000_READ_REG ( &adapter->hw, RCTL ) ); |
---|
764 | |
---|
765 | rx_len = rx_curr_desc->length; |
---|
766 | |
---|
767 | DBG ( "Received packet, rx_curr: %d rx_status: %#08x rx_len: %d\n", |
---|
768 | i, rx_status, rx_len ); |
---|
769 | |
---|
770 | rx_err = rx_curr_desc->errors; |
---|
771 | |
---|
772 | iob_put ( adapter->rx_iobuf[i], rx_len ); |
---|
773 | |
---|
774 | if ( rx_err & E1000_RXD_ERR_FRAME_ERR_MASK ) { |
---|
775 | |
---|
776 | netdev_rx_err ( netdev, adapter->rx_iobuf[i], -EINVAL ); |
---|
777 | DBG ( "e1000_poll: Corrupted packet received!" |
---|
778 | " rx_err: %#08x\n", rx_err ); |
---|
779 | } else { |
---|
780 | /* Add this packet to the receive queue. */ |
---|
781 | netdev_rx ( netdev, adapter->rx_iobuf[i] ); |
---|
782 | } |
---|
783 | adapter->rx_iobuf[i] = NULL; |
---|
784 | |
---|
785 | memset ( rx_curr_desc, 0, sizeof ( *rx_curr_desc ) ); |
---|
786 | |
---|
787 | adapter->rx_curr = ( adapter->rx_curr + 1 ) % NUM_RX_DESC; |
---|
788 | } |
---|
789 | e1000_refill_rx_ring(adapter); |
---|
790 | } |
---|
791 | |
---|
792 | /** |
---|
793 | * e1000_irq - enable or Disable interrupts |
---|
794 | * |
---|
795 | * @v adapter e1000 adapter |
---|
796 | * @v action requested interrupt action |
---|
797 | **/ |
---|
798 | static void |
---|
799 | e1000_irq ( struct net_device *netdev, int enable ) |
---|
800 | { |
---|
801 | struct e1000_adapter *adapter = netdev_priv(netdev); |
---|
802 | |
---|
803 | DBG ( "e1000_irq\n" ); |
---|
804 | |
---|
805 | if ( enable ) |
---|
806 | e1000_irq_enable ( adapter ); |
---|
807 | else |
---|
808 | e1000_irq_disable ( adapter ); |
---|
809 | } |
---|
810 | |
---|
811 | static struct net_device_operations e1000_operations; |
---|
812 | |
---|
813 | /** |
---|
814 | * e1000_probe - Initial configuration of e1000 NIC |
---|
815 | * |
---|
816 | * @v pci PCI device |
---|
817 | * @v id PCI IDs |
---|
818 | * |
---|
819 | * @ret rc Return status code |
---|
820 | **/ |
---|
821 | static int |
---|
822 | e1000_probe ( struct pci_device *pdev, |
---|
823 | const struct pci_device_id *id __unused ) |
---|
824 | { |
---|
825 | int i, err; |
---|
826 | struct net_device *netdev; |
---|
827 | struct e1000_adapter *adapter; |
---|
828 | unsigned long mmio_start, mmio_len; |
---|
829 | unsigned long flash_start, flash_len; |
---|
830 | |
---|
831 | DBG ( "e1000_probe\n" ); |
---|
832 | |
---|
833 | err = -ENOMEM; |
---|
834 | |
---|
835 | /* Allocate net device ( also allocates memory for netdev->priv |
---|
836 | and makes netdev-priv point to it ) */ |
---|
837 | netdev = alloc_etherdev ( sizeof ( struct e1000_adapter ) ); |
---|
838 | if ( ! netdev ) |
---|
839 | goto err_alloc_etherdev; |
---|
840 | |
---|
841 | /* Associate e1000-specific network operations operations with |
---|
842 | * generic network device layer */ |
---|
843 | netdev_init ( netdev, &e1000_operations ); |
---|
844 | |
---|
845 | /* Associate this network device with given PCI device */ |
---|
846 | pci_set_drvdata ( pdev, netdev ); |
---|
847 | netdev->dev = &pdev->dev; |
---|
848 | |
---|
849 | /* Initialize driver private storage */ |
---|
850 | adapter = netdev_priv ( netdev ); |
---|
851 | memset ( adapter, 0, ( sizeof ( *adapter ) ) ); |
---|
852 | |
---|
853 | adapter->hw.io_base = pdev->ioaddr; |
---|
854 | adapter->ioaddr = pdev->ioaddr; |
---|
855 | adapter->irqno = pdev->irq; |
---|
856 | adapter->netdev = netdev; |
---|
857 | adapter->pdev = pdev; |
---|
858 | adapter->hw.back = adapter; |
---|
859 | |
---|
860 | adapter->tx_ring_size = sizeof ( *adapter->tx_base ) * NUM_TX_DESC; |
---|
861 | adapter->rx_ring_size = sizeof ( *adapter->rx_base ) * NUM_RX_DESC; |
---|
862 | |
---|
863 | mmio_start = pci_bar_start ( pdev, PCI_BASE_ADDRESS_0 ); |
---|
864 | mmio_len = pci_bar_size ( pdev, PCI_BASE_ADDRESS_0 ); |
---|
865 | |
---|
866 | DBG ( "mmio_start: %#08lx\n", mmio_start ); |
---|
867 | DBG ( "mmio_len: %#08lx\n", mmio_len ); |
---|
868 | |
---|
869 | /* Fix up PCI device */ |
---|
870 | adjust_pci_device ( pdev ); |
---|
871 | |
---|
872 | err = -EIO; |
---|
873 | |
---|
874 | adapter->hw.hw_addr = ioremap ( mmio_start, mmio_len ); |
---|
875 | DBG ( "adapter->hw.hw_addr: %p\n", adapter->hw.hw_addr ); |
---|
876 | |
---|
877 | if ( ! adapter->hw.hw_addr ) |
---|
878 | goto err_ioremap; |
---|
879 | |
---|
880 | /* setup the private structure */ |
---|
881 | if ( ( err = e1000_sw_init ( adapter ) ) ) |
---|
882 | goto err_sw_init; |
---|
883 | |
---|
884 | DBG ( "adapter->hw.mac_type: %#08x\n", adapter->hw.mac_type ); |
---|
885 | |
---|
886 | /* Flash BAR mapping must happen after e1000_sw_init |
---|
887 | * because it depends on mac_type |
---|
888 | */ |
---|
889 | if ( ( adapter->hw.mac_type == e1000_ich8lan ) && ( pdev->ioaddr ) ) { |
---|
890 | flash_start = pci_bar_start ( pdev, PCI_BASE_ADDRESS_1 ); |
---|
891 | flash_len = pci_bar_size ( pdev, PCI_BASE_ADDRESS_1 ); |
---|
892 | adapter->hw.flash_address = ioremap ( flash_start, flash_len ); |
---|
893 | if ( ! adapter->hw.flash_address ) |
---|
894 | goto err_flashmap; |
---|
895 | } |
---|
896 | |
---|
897 | /* initialize eeprom parameters */ |
---|
898 | if ( e1000_init_eeprom_params ( &adapter->hw ) ) { |
---|
899 | DBG ( "EEPROM initialization failed\n" ); |
---|
900 | goto err_eeprom; |
---|
901 | } |
---|
902 | |
---|
903 | /* before reading the EEPROM, reset the controller to |
---|
904 | * put the device in a known good starting state |
---|
905 | */ |
---|
906 | err = e1000_reset_hw ( &adapter->hw ); |
---|
907 | if ( err < 0 ) { |
---|
908 | DBG ( "Hardware Initialization Failed\n" ); |
---|
909 | goto err_reset; |
---|
910 | } |
---|
911 | |
---|
912 | /* make sure the EEPROM is good */ |
---|
913 | if ( e1000_validate_eeprom_checksum( &adapter->hw ) < 0 ) { |
---|
914 | DBG ( "The EEPROM Checksum Is Not Valid\n" ); |
---|
915 | goto err_eeprom; |
---|
916 | } |
---|
917 | |
---|
918 | /* copy the MAC address out of the EEPROM */ |
---|
919 | if ( e1000_read_mac_addr ( &adapter->hw ) ) |
---|
920 | DBG ( "EEPROM Read Error\n" ); |
---|
921 | |
---|
922 | memcpy ( netdev->hw_addr, adapter->hw.mac_addr, ETH_ALEN ); |
---|
923 | |
---|
924 | /* print bus type/speed/width info */ |
---|
925 | { |
---|
926 | struct e1000_hw *hw = &adapter->hw; |
---|
927 | DBG ( "(PCI%s:%s:%s) ", |
---|
928 | ((hw->bus_type == e1000_bus_type_pcix) ? "-X" : |
---|
929 | (hw->bus_type == e1000_bus_type_pci_express ? " Express":"")), |
---|
930 | ((hw->bus_speed == e1000_bus_speed_2500) ? "2.5Gb/s" : |
---|
931 | (hw->bus_speed == e1000_bus_speed_133) ? "133MHz" : |
---|
932 | (hw->bus_speed == e1000_bus_speed_120) ? "120MHz" : |
---|
933 | (hw->bus_speed == e1000_bus_speed_100) ? "100MHz" : |
---|
934 | (hw->bus_speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"), |
---|
935 | ((hw->bus_width == e1000_bus_width_64) ? "64-bit" : |
---|
936 | (hw->bus_width == e1000_bus_width_pciex_4) ? "Width x4" : |
---|
937 | (hw->bus_width == e1000_bus_width_pciex_1) ? "Width x1" : |
---|
938 | "32-bit")); |
---|
939 | } |
---|
940 | for (i = 0; i < 6; i++) |
---|
941 | DBG ("%02x%s", netdev->ll_addr[i], i == 5 ? "\n" : ":"); |
---|
942 | |
---|
943 | /* reset the hardware with the new settings */ |
---|
944 | e1000_reset ( adapter ); |
---|
945 | |
---|
946 | e1000_get_hw_control ( adapter ); |
---|
947 | |
---|
948 | /* Mark as link up; we don't yet handle link state */ |
---|
949 | netdev_link_up ( netdev ); |
---|
950 | |
---|
951 | if ( ( err = register_netdev ( netdev ) ) != 0) |
---|
952 | goto err_register; |
---|
953 | |
---|
954 | DBG ( "e1000_probe succeeded!\n" ); |
---|
955 | |
---|
956 | /* No errors, return success */ |
---|
957 | return 0; |
---|
958 | |
---|
959 | /* Error return paths */ |
---|
960 | err_reset: |
---|
961 | err_register: |
---|
962 | err_eeprom: |
---|
963 | if ( ! e1000_check_phy_reset_block ( &adapter->hw ) ) |
---|
964 | e1000_phy_hw_reset ( &adapter->hw ); |
---|
965 | if ( adapter->hw.flash_address ) |
---|
966 | iounmap ( adapter->hw.flash_address ); |
---|
967 | err_flashmap: |
---|
968 | err_sw_init: |
---|
969 | iounmap ( adapter->hw.hw_addr ); |
---|
970 | err_ioremap: |
---|
971 | netdev_put ( netdev ); |
---|
972 | err_alloc_etherdev: |
---|
973 | return err; |
---|
974 | } |
---|
975 | |
---|
976 | /** |
---|
977 | * e1000_remove - Device Removal Routine |
---|
978 | * |
---|
979 | * @v pdev PCI device information struct |
---|
980 | * |
---|
981 | **/ |
---|
982 | static void |
---|
983 | e1000_remove ( struct pci_device *pdev ) |
---|
984 | { |
---|
985 | struct net_device *netdev = pci_get_drvdata ( pdev ); |
---|
986 | struct e1000_adapter *adapter = netdev_priv ( netdev ); |
---|
987 | |
---|
988 | DBG ( "e1000_remove\n" ); |
---|
989 | |
---|
990 | if ( adapter->hw.flash_address ) |
---|
991 | iounmap ( adapter->hw.flash_address ); |
---|
992 | if ( adapter->hw.hw_addr ) |
---|
993 | iounmap ( adapter->hw.hw_addr ); |
---|
994 | |
---|
995 | unregister_netdev ( netdev ); |
---|
996 | e1000_reset_hw ( &adapter->hw ); |
---|
997 | netdev_nullify ( netdev ); |
---|
998 | netdev_put ( netdev ); |
---|
999 | } |
---|
1000 | |
---|
1001 | /** |
---|
1002 | * e1000_open - Called when a network interface is made active |
---|
1003 | * |
---|
1004 | * @v netdev network interface device structure |
---|
1005 | * @ret rc Return status code, 0 on success, negative value on failure |
---|
1006 | * |
---|
1007 | **/ |
---|
1008 | static int |
---|
1009 | e1000_open ( struct net_device *netdev ) |
---|
1010 | { |
---|
1011 | struct e1000_adapter *adapter = netdev_priv(netdev); |
---|
1012 | int err; |
---|
1013 | |
---|
1014 | DBG ( "e1000_open\n" ); |
---|
1015 | |
---|
1016 | /* allocate transmit descriptors */ |
---|
1017 | err = e1000_setup_tx_resources ( adapter ); |
---|
1018 | if ( err ) { |
---|
1019 | DBG ( "Error setting up TX resources!\n" ); |
---|
1020 | goto err_setup_tx; |
---|
1021 | } |
---|
1022 | |
---|
1023 | /* allocate receive descriptors */ |
---|
1024 | err = e1000_setup_rx_resources ( adapter ); |
---|
1025 | if ( err ) { |
---|
1026 | DBG ( "Error setting up RX resources!\n" ); |
---|
1027 | goto err_setup_rx; |
---|
1028 | } |
---|
1029 | |
---|
1030 | e1000_configure_tx ( adapter ); |
---|
1031 | |
---|
1032 | e1000_configure_rx ( adapter ); |
---|
1033 | |
---|
1034 | DBG ( "RXDCTL: %#08x\n", E1000_READ_REG ( &adapter->hw, RXDCTL ) ); |
---|
1035 | |
---|
1036 | return 0; |
---|
1037 | |
---|
1038 | err_setup_rx: |
---|
1039 | e1000_free_tx_resources ( adapter ); |
---|
1040 | err_setup_tx: |
---|
1041 | e1000_reset ( adapter ); |
---|
1042 | |
---|
1043 | return err; |
---|
1044 | } |
---|
1045 | |
---|
1046 | /** e1000 net device operations */ |
---|
1047 | static struct net_device_operations e1000_operations = { |
---|
1048 | .open = e1000_open, |
---|
1049 | .close = e1000_close, |
---|
1050 | .transmit = e1000_transmit, |
---|
1051 | .poll = e1000_poll, |
---|
1052 | .irq = e1000_irq, |
---|
1053 | }; |
---|
1054 | |
---|
1055 | int32_t |
---|
1056 | e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value) |
---|
1057 | { |
---|
1058 | struct e1000_adapter *adapter = hw->back; |
---|
1059 | uint16_t cap_offset; |
---|
1060 | |
---|
1061 | #define PCI_CAP_ID_EXP 0x10 /* PCI Express */ |
---|
1062 | cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP); |
---|
1063 | if (!cap_offset) |
---|
1064 | return -E1000_ERR_CONFIG; |
---|
1065 | |
---|
1066 | pci_read_config_word(adapter->pdev, cap_offset + reg, value); |
---|
1067 | |
---|
1068 | return 0; |
---|
1069 | } |
---|
1070 | |
---|
1071 | void |
---|
1072 | e1000_pci_clear_mwi ( struct e1000_hw *hw ) |
---|
1073 | { |
---|
1074 | struct e1000_adapter *adapter = hw->back; |
---|
1075 | |
---|
1076 | pci_write_config_word ( adapter->pdev, PCI_COMMAND, |
---|
1077 | hw->pci_cmd_word & ~PCI_COMMAND_INVALIDATE ); |
---|
1078 | } |
---|
1079 | |
---|
1080 | void |
---|
1081 | e1000_pci_set_mwi ( struct e1000_hw *hw ) |
---|
1082 | { |
---|
1083 | struct e1000_adapter *adapter = hw->back; |
---|
1084 | |
---|
1085 | pci_write_config_word ( adapter->pdev, PCI_COMMAND, hw->pci_cmd_word ); |
---|
1086 | } |
---|
1087 | |
---|
1088 | void |
---|
1089 | e1000_read_pci_cfg ( struct e1000_hw *hw, uint32_t reg, uint16_t *value ) |
---|
1090 | { |
---|
1091 | struct e1000_adapter *adapter = hw->back; |
---|
1092 | |
---|
1093 | pci_read_config_word ( adapter->pdev, reg, value ); |
---|
1094 | } |
---|
1095 | |
---|
1096 | void |
---|
1097 | e1000_write_pci_cfg ( struct e1000_hw *hw, uint32_t reg, uint16_t *value ) |
---|
1098 | { |
---|
1099 | struct e1000_adapter *adapter = hw->back; |
---|
1100 | |
---|
1101 | pci_write_config_word ( adapter->pdev, reg, *value ); |
---|
1102 | } |
---|
1103 | |
---|
1104 | void |
---|
1105 | e1000_io_write ( struct e1000_hw *hw __unused, unsigned long port, uint32_t value ) |
---|
1106 | { |
---|
1107 | outl ( value, port ); |
---|
1108 | } |
---|
1109 | |
---|
1110 | static struct pci_device_id e1000_nics[] = { |
---|
1111 | PCI_ROM(0x8086, 0x1000, "e1000-0x1000", "e1000-0x1000", 0), |
---|
1112 | PCI_ROM(0x8086, 0x1001, "e1000-0x1001", "e1000-0x1001", 0), |
---|
1113 | PCI_ROM(0x8086, 0x1004, "e1000-0x1004", "e1000-0x1004", 0), |
---|
1114 | PCI_ROM(0x8086, 0x1008, "e1000-0x1008", "e1000-0x1008", 0), |
---|
1115 | PCI_ROM(0x8086, 0x1009, "e1000-0x1009", "e1000-0x1009", 0), |
---|
1116 | PCI_ROM(0x8086, 0x100c, "e1000-0x100c", "e1000-0x100c", 0), |
---|
1117 | PCI_ROM(0x8086, 0x100d, "e1000-0x100d", "e1000-0x100d", 0), |
---|
1118 | PCI_ROM(0x8086, 0x100e, "e1000-0x100e", "e1000-0x100e", 0), |
---|
1119 | PCI_ROM(0x8086, 0x100f, "e1000-0x100f", "e1000-0x100f", 0), |
---|
1120 | PCI_ROM(0x8086, 0x1010, "e1000-0x1010", "e1000-0x1010", 0), |
---|
1121 | PCI_ROM(0x8086, 0x1011, "e1000-0x1011", "e1000-0x1011", 0), |
---|
1122 | PCI_ROM(0x8086, 0x1012, "e1000-0x1012", "e1000-0x1012", 0), |
---|
1123 | PCI_ROM(0x8086, 0x1013, "e1000-0x1013", "e1000-0x1013", 0), |
---|
1124 | PCI_ROM(0x8086, 0x1014, "e1000-0x1014", "e1000-0x1014", 0), |
---|
1125 | PCI_ROM(0x8086, 0x1015, "e1000-0x1015", "e1000-0x1015", 0), |
---|
1126 | PCI_ROM(0x8086, 0x1016, "e1000-0x1016", "e1000-0x1016", 0), |
---|
1127 | PCI_ROM(0x8086, 0x1017, "e1000-0x1017", "e1000-0x1017", 0), |
---|
1128 | PCI_ROM(0x8086, 0x1018, "e1000-0x1018", "e1000-0x1018", 0), |
---|
1129 | PCI_ROM(0x8086, 0x1019, "e1000-0x1019", "e1000-0x1019", 0), |
---|
1130 | PCI_ROM(0x8086, 0x101a, "e1000-0x101a", "e1000-0x101a", 0), |
---|
1131 | PCI_ROM(0x8086, 0x101d, "e1000-0x101d", "e1000-0x101d", 0), |
---|
1132 | PCI_ROM(0x8086, 0x101e, "e1000-0x101e", "e1000-0x101e", 0), |
---|
1133 | PCI_ROM(0x8086, 0x1026, "e1000-0x1026", "e1000-0x1026", 0), |
---|
1134 | PCI_ROM(0x8086, 0x1027, "e1000-0x1027", "e1000-0x1027", 0), |
---|
1135 | PCI_ROM(0x8086, 0x1028, "e1000-0x1028", "e1000-0x1028", 0), |
---|
1136 | PCI_ROM(0x8086, 0x1049, "e1000-0x1049", "e1000-0x1049", 0), |
---|
1137 | PCI_ROM(0x8086, 0x104a, "e1000-0x104a", "e1000-0x104a", 0), |
---|
1138 | PCI_ROM(0x8086, 0x104b, "e1000-0x104b", "e1000-0x104b", 0), |
---|
1139 | PCI_ROM(0x8086, 0x104c, "e1000-0x104c", "e1000-0x104c", 0), |
---|
1140 | PCI_ROM(0x8086, 0x104d, "e1000-0x104d", "e1000-0x104d", 0), |
---|
1141 | PCI_ROM(0x8086, 0x105e, "e1000-0x105e", "e1000-0x105e", 0), |
---|
1142 | PCI_ROM(0x8086, 0x105f, "e1000-0x105f", "e1000-0x105f", 0), |
---|
1143 | PCI_ROM(0x8086, 0x1060, "e1000-0x1060", "e1000-0x1060", 0), |
---|
1144 | PCI_ROM(0x8086, 0x1075, "e1000-0x1075", "e1000-0x1075", 0), |
---|
1145 | PCI_ROM(0x8086, 0x1076, "e1000-0x1076", "e1000-0x1076", 0), |
---|
1146 | PCI_ROM(0x8086, 0x1077, "e1000-0x1077", "e1000-0x1077", 0), |
---|
1147 | PCI_ROM(0x8086, 0x1078, "e1000-0x1078", "e1000-0x1078", 0), |
---|
1148 | PCI_ROM(0x8086, 0x1079, "e1000-0x1079", "e1000-0x1079", 0), |
---|
1149 | PCI_ROM(0x8086, 0x107a, "e1000-0x107a", "e1000-0x107a", 0), |
---|
1150 | PCI_ROM(0x8086, 0x107b, "e1000-0x107b", "e1000-0x107b", 0), |
---|
1151 | PCI_ROM(0x8086, 0x107c, "e1000-0x107c", "e1000-0x107c", 0), |
---|
1152 | PCI_ROM(0x8086, 0x107d, "e1000-0x107d", "e1000-0x107d", 0), |
---|
1153 | PCI_ROM(0x8086, 0x107e, "e1000-0x107e", "e1000-0x107e", 0), |
---|
1154 | PCI_ROM(0x8086, 0x107f, "e1000-0x107f", "e1000-0x107f", 0), |
---|
1155 | PCI_ROM(0x8086, 0x108a, "e1000-0x108a", "e1000-0x108a", 0), |
---|
1156 | PCI_ROM(0x8086, 0x108b, "e1000-0x108b", "e1000-0x108b", 0), |
---|
1157 | PCI_ROM(0x8086, 0x108c, "e1000-0x108c", "e1000-0x108c", 0), |
---|
1158 | PCI_ROM(0x8086, 0x1096, "e1000-0x1096", "e1000-0x1096", 0), |
---|
1159 | PCI_ROM(0x8086, 0x1098, "e1000-0x1098", "e1000-0x1098", 0), |
---|
1160 | PCI_ROM(0x8086, 0x1099, "e1000-0x1099", "e1000-0x1099", 0), |
---|
1161 | PCI_ROM(0x8086, 0x109a, "e1000-0x109a", "e1000-0x109a", 0), |
---|
1162 | PCI_ROM(0x8086, 0x10a4, "e1000-0x10a4", "e1000-0x10a4", 0), |
---|
1163 | PCI_ROM(0x8086, 0x10a5, "e1000-0x10a5", "e1000-0x10a5", 0), |
---|
1164 | PCI_ROM(0x8086, 0x10b5, "e1000-0x10b5", "e1000-0x10b5", 0), |
---|
1165 | PCI_ROM(0x8086, 0x10b9, "e1000-0x10b9", "e1000-0x10b9", 0), |
---|
1166 | PCI_ROM(0x8086, 0x10ba, "e1000-0x10ba", "e1000-0x10ba", 0), |
---|
1167 | PCI_ROM(0x8086, 0x10bb, "e1000-0x10bb", "e1000-0x10bb", 0), |
---|
1168 | PCI_ROM(0x8086, 0x10bc, "e1000-0x10bc", "e1000-0x10bc", 0), |
---|
1169 | PCI_ROM(0x8086, 0x10c4, "e1000-0x10c4", "e1000-0x10c4", 0), |
---|
1170 | PCI_ROM(0x8086, 0x10c5, "e1000-0x10c5", "e1000-0x10c5", 0), |
---|
1171 | PCI_ROM(0x8086, 0x10c9, "e1000-0x10c9", "e1000-0x10c9", 0), |
---|
1172 | PCI_ROM(0x8086, 0x10d9, "e1000-0x10d9", "e1000-0x10d9", 0), |
---|
1173 | PCI_ROM(0x8086, 0x10da, "e1000-0x10da", "e1000-0x10da", 0), |
---|
1174 | }; |
---|
1175 | |
---|
1176 | struct pci_driver e1000_driver __pci_driver = { |
---|
1177 | .ids = e1000_nics, |
---|
1178 | .id_count = (sizeof (e1000_nics) / sizeof (e1000_nics[0])), |
---|
1179 | .probe = e1000_probe, |
---|
1180 | .remove = e1000_remove, |
---|
1181 | }; |
---|
1182 | |
---|
1183 | /* |
---|
1184 | * Local variables: |
---|
1185 | * c-basic-offset: 8 |
---|
1186 | * c-indent-level: 8 |
---|
1187 | * tab-width: 8 |
---|
1188 | * End: |
---|
1189 | */ |
---|