[pci] Add driver_data field to struct pci_device_id
[people/lynusvaz/gpxe.git] / src / drivers / net / etherfabric.c
1 /**************************************************************************
2  *
3  * Etherboot driver for Level 5 Etherfabric network cards
4  *
5  * Written by Michael Brown <mbrown@fensystems.co.uk>
6  *
7  * Copyright Fen Systems Ltd. 2005
8  * Copyright Level 5 Networks Inc. 2005
9  *
10  * This software may be used and distributed according to the terms of
11  * the GNU General Public License (GPL), incorporated herein by
12  * reference.  Drivers based on or derived from this code fall under
13  * the GPL and must retain the authorship, copyright and license
14  * notice.
15  *
16  **************************************************************************
17  */
18 #include <stdint.h>
19 #include <stdlib.h>
20 #include <unistd.h>
21 #include <errno.h>
22 #include <assert.h>
23 #include <byteswap.h>
24 #include <console.h>
25 #include <gpxe/io.h>
26 #include <gpxe/pci.h>
27 #include <gpxe/malloc.h>
28 #include <gpxe/ethernet.h>
29 #include <gpxe/iobuf.h>
30 #include <gpxe/netdevice.h>
31 #include <gpxe/timer.h>
32 #include "etherfabric.h"
33 #include "etherfabric_nic.h"
34
35 /**************************************************************************
36  *
37  * Constants and macros
38  *
39  **************************************************************************
40  */
41
42 #define EFAB_REGDUMP(...)
43 #define EFAB_TRACE(...) DBGP(__VA_ARGS__)
44
45 // printf() is not allowed within drivers.  Use DBG() instead.
46 #define EFAB_LOG(...) DBG(__VA_ARGS__)
47 #define EFAB_ERR(...) DBG(__VA_ARGS__)
48
49 #define FALCON_USE_IO_BAR 0
50
51 #define HZ 100
52 #define EFAB_BYTE 1
53
54 /**************************************************************************
55  *
56  * Hardware data structures and sizing
57  *
58  **************************************************************************
59  */
60 extern int __invalid_queue_size;
61 #define FQS(_prefix, _x)                                        \
62         ( ( (_x) == 512 ) ? _prefix ## _SIZE_512 :              \
63           ( ( (_x) == 1024 ) ? _prefix ## _SIZE_1K :            \
64             ( ( (_x) == 2048 ) ? _prefix ## _SIZE_2K :          \
65               ( ( (_x) == 4096) ? _prefix ## _SIZE_4K :         \
66                 __invalid_queue_size ) ) ) )
67
68
69 #define EFAB_MAX_FRAME_LEN(mtu)                         \
70         ( ( ( ( mtu ) + 4/* FCS */ ) + 7 ) & ~7 )
71
72 /**************************************************************************
73  *
74  * GMII routines
75  *
76  **************************************************************************
77  */
78
79 static void falcon_mdio_write (struct efab_nic *efab, int device,
80                                int location, int value );
81 static int falcon_mdio_read ( struct efab_nic *efab, int device, int location );
82
83 /* GMII registers */
84 #define MII_BMSR                0x01    /* Basic mode status register  */
85 #define MII_ADVERTISE           0x04    /* Advertisement control register */
86 #define MII_LPA                 0x05    /* Link partner ability register*/
87 #define GMII_GTCR               0x09    /* 1000BASE-T control register */
88 #define GMII_GTSR               0x0a    /* 1000BASE-T status register */
89 #define GMII_PSSR               0x11    /* PHY-specific status register */
90
91 /* Basic mode status register. */
92 #define BMSR_LSTATUS            0x0004  /* Link status                 */
93
94 /* Link partner ability register. */
95 #define LPA_10HALF              0x0020  /* Can do 10mbps half-duplex   */
96 #define LPA_10FULL              0x0040  /* Can do 10mbps full-duplex   */
97 #define LPA_100HALF             0x0080  /* Can do 100mbps half-duplex  */
98 #define LPA_100FULL             0x0100  /* Can do 100mbps full-duplex  */
99 #define LPA_100BASE4            0x0200  /* Can do 100mbps 4k packets   */
100 #define LPA_PAUSE               0x0400  /* Bit 10 - MAC pause */
101
102 /* Pseudo extensions to the link partner ability register */
103 #define LPA_1000FULL            0x00020000
104 #define LPA_1000HALF            0x00010000
105 #define LPA_10000FULL           0x00040000
106 #define LPA_10000HALF           0x00080000
107
108 #define LPA_100                 (LPA_100FULL | LPA_100HALF | LPA_100BASE4)
109 #define LPA_1000                ( LPA_1000FULL | LPA_1000HALF )
110 #define LPA_10000               ( LPA_10000FULL | LPA_10000HALF )
111 #define LPA_DUPLEX              ( LPA_10FULL | LPA_100FULL | LPA_1000FULL | \
112                                   LPA_10000FULL )
113
114 /* Mask of bits not associated with speed or duplexity. */
115 #define LPA_OTHER               ~( LPA_10FULL | LPA_10HALF | LPA_100FULL | \
116                                    LPA_100HALF | LPA_1000FULL | LPA_1000HALF )
117
118 /* PHY-specific status register */
119 #define PSSR_LSTATUS            0x0400  /* Bit 10 - link status */
120
121 /**
122  * Retrieve GMII autonegotiation advertised abilities
123  *
124  */
125 static unsigned int
126 gmii_autoneg_advertised ( struct efab_nic *efab )
127 {
128         unsigned int mii_advertise;
129         unsigned int gmii_advertise;
130
131         /* Extended bits are in bits 8 and 9 of GMII_GTCR */
132         mii_advertise = falcon_mdio_read ( efab, 0, MII_ADVERTISE );
133         gmii_advertise = ( ( falcon_mdio_read ( efab, 0, GMII_GTCR ) >> 8 )
134                            & 0x03 );
135         return ( ( gmii_advertise << 16 ) | mii_advertise );
136 }
137
138 /**
139  * Retrieve GMII autonegotiation link partner abilities
140  *
141  */
142 static unsigned int
143 gmii_autoneg_lpa ( struct efab_nic *efab )
144 {
145         unsigned int mii_lpa;
146         unsigned int gmii_lpa;
147
148         /* Extended bits are in bits 10 and 11 of GMII_GTSR */
149         mii_lpa = falcon_mdio_read ( efab, 0, MII_LPA );
150         gmii_lpa = ( falcon_mdio_read ( efab, 0, GMII_GTSR ) >> 10 ) & 0x03;
151         return ( ( gmii_lpa << 16 ) | mii_lpa );
152 }
153
154 /**
155  * Calculate GMII autonegotiated link technology
156  *
157  */
158 static unsigned int
159 gmii_nway_result ( unsigned int negotiated )
160 {
161         unsigned int other_bits;
162
163         /* Mask out the speed and duplexity bits */
164         other_bits = negotiated & LPA_OTHER;
165
166         if ( negotiated & LPA_1000FULL )
167                 return ( other_bits | LPA_1000FULL );
168         else if ( negotiated & LPA_1000HALF )
169                 return ( other_bits | LPA_1000HALF );
170         else if ( negotiated & LPA_100FULL )
171                 return ( other_bits | LPA_100FULL );
172         else if ( negotiated & LPA_100BASE4 )
173                 return ( other_bits | LPA_100BASE4 );
174         else if ( negotiated & LPA_100HALF )
175                 return ( other_bits | LPA_100HALF );
176         else if ( negotiated & LPA_10FULL )
177                 return ( other_bits | LPA_10FULL );
178         else return ( other_bits | LPA_10HALF );
179 }
180
181 /**
182  * Check GMII PHY link status
183  *
184  */
185 static int
186 gmii_link_ok ( struct efab_nic *efab )
187 {
188         int status;
189         int phy_status;
190
191         /* BMSR is latching - it returns "link down" if the link has
192          * been down at any point since the last read.  To get a
193          * real-time status, we therefore read the register twice and
194          * use the result of the second read.
195          */
196         (void) falcon_mdio_read ( efab, 0, MII_BMSR );
197         status = falcon_mdio_read ( efab, 0, MII_BMSR );
198
199         /* Read the PHY-specific Status Register.  This is
200          * non-latching, so we need do only a single read.
201          */
202         phy_status = falcon_mdio_read ( efab, 0, GMII_PSSR );
203
204         return ( ( status & BMSR_LSTATUS ) && ( phy_status & PSSR_LSTATUS ) );
205 }
206
207 /**************************************************************************
208  *
209  * MDIO routines
210  *
211  **************************************************************************
212  */
213
214 /* Numbering of the MDIO Manageable Devices (MMDs) */
215 /* Physical Medium Attachment/ Physical Medium Dependent sublayer */
216 #define MDIO_MMD_PMAPMD (1)
217 /* WAN Interface Sublayer */
218 #define MDIO_MMD_WIS    (2)
219 /* Physical Coding Sublayer */
220 #define MDIO_MMD_PCS    (3)
221 /* PHY Extender Sublayer */
222 #define MDIO_MMD_PHYXS  (4)
223 /* Extender Sublayer */
224 #define MDIO_MMD_DTEXS  (5)
225 /* Transmission convergence */
226 #define MDIO_MMD_TC     (6)
227 /* Auto negotiation */
228 #define MDIO_MMD_AN     (7)
229
230 /* Generic register locations */
231 #define MDIO_MMDREG_CTRL1       (0)
232 #define MDIO_MMDREG_STAT1       (1)
233 #define MDIO_MMDREG_DEVS0       (5)
234 #define MDIO_MMDREG_STAT2       (8)
235
236 /* Bits in MMDREG_CTRL1 */
237 /* Reset */
238 #define MDIO_MMDREG_CTRL1_RESET_LBN     (15)
239 #define MDIO_MMDREG_CTRL1_RESET_WIDTH   (1)
240
241 /* Bits in MMDREG_STAT1 */
242 #define MDIO_MMDREG_STAT1_FAULT_LBN     (7)
243 #define MDIO_MMDREG_STAT1_FAULT_WIDTH   (1)
244
245 /* Link state */
246 #define MDIO_MMDREG_STAT1_LINK_LBN      (2)
247 #define MDIO_MMDREG_STAT1_LINK_WIDTH    (1)
248
249 /* Bits in MMDREG_DEVS0. */
250 #define DEV_PRESENT_BIT(_b) (1 << _b)
251
252 #define MDIO_MMDREG_DEVS0_DTEXS  DEV_PRESENT_BIT(MDIO_MMD_DTEXS)
253 #define MDIO_MMDREG_DEVS0_PHYXS  DEV_PRESENT_BIT(MDIO_MMD_PHYXS)
254 #define MDIO_MMDREG_DEVS0_PCS    DEV_PRESENT_BIT(MDIO_MMD_PCS)
255 #define MDIO_MMDREG_DEVS0_WIS    DEV_PRESENT_BIT(MDIO_MMD_WIS)
256 #define MDIO_MMDREG_DEVS0_PMAPMD DEV_PRESENT_BIT(MDIO_MMD_PMAPMD)
257
258 #define MDIO_MMDREG_DEVS0_AN     DEV_PRESENT_BIT(MDIO_MMD_AN)
259
260 /* Bits in MMDREG_STAT2 */
261 #define MDIO_MMDREG_STAT2_PRESENT_VAL   (2)
262 #define MDIO_MMDREG_STAT2_PRESENT_LBN   (14)
263 #define MDIO_MMDREG_STAT2_PRESENT_WIDTH (2)
264
265 /* PHY XGXS lane state */
266 #define MDIO_PHYXS_LANE_STATE           (0x18) 
267 #define MDIO_PHYXS_LANE_ALIGNED_LBN     (12)
268 #define MDIO_PHYXS_LANE_SYNC0_LBN       (0)
269 #define MDIO_PHYXS_LANE_SYNC1_LBN       (1)
270 #define MDIO_PHYXS_LANE_SYNC2_LBN       (2)
271 #define MDIO_PHYXS_LANE_SYNC3_LBN       (3)
272
273 /* This ought to be ridiculous overkill. We expect it to fail rarely */
274 #define MDIO45_RESET_TRIES      100
275 #define MDIO45_RESET_SPINTIME   10
276
277 static int
278 mdio_clause45_wait_reset_mmds ( struct efab_nic* efab )
279 {
280         int tries = MDIO45_RESET_TRIES;
281         int in_reset;
282
283         while(tries) {
284                 int mask = efab->phy_op->mmds;
285                 int mmd = 0;
286                 in_reset = 0;
287                 while(mask) {
288                         if (mask & 1) {
289                                 int stat = falcon_mdio_read ( efab,  mmd,
290                                                               MDIO_MMDREG_CTRL1 );
291                                 if (stat < 0) {
292                                         EFAB_ERR("Failed to read status of MMD %d\n",
293                                                  mmd );
294                                         in_reset = 1;
295                                         break;
296                                 }
297                                 if (stat & (1 << MDIO_MMDREG_CTRL1_RESET_LBN))
298                                         in_reset |= (1 << mmd);
299                         }
300                         mask = mask >> 1;
301                         mmd++;
302                 }
303                 if (!in_reset)
304                         break;
305                 tries--;
306                 mdelay ( MDIO45_RESET_SPINTIME );
307         }
308         if (in_reset != 0) {
309                 EFAB_ERR("Not all MMDs came out of reset in time. MMDs "
310                          "still in reset: %x\n", in_reset);
311                 return -ETIMEDOUT;
312         }
313         return 0;
314 }
315
316 static int
317 mdio_clause45_reset_mmd ( struct efab_nic *efab, int mmd )
318 {
319         int tries = MDIO45_RESET_TRIES;
320         int ctrl;
321
322         falcon_mdio_write ( efab, mmd, MDIO_MMDREG_CTRL1,
323                             ( 1 << MDIO_MMDREG_CTRL1_RESET_LBN ) );
324
325         /* Wait for the reset bit to clear. */
326         do {
327                 mdelay ( MDIO45_RESET_SPINTIME );
328
329                 ctrl = falcon_mdio_read ( efab, mmd, MDIO_MMDREG_CTRL1 );
330                 if ( ~ctrl & ( 1 << MDIO_MMDREG_CTRL1_RESET_LBN ) )
331                         return 0;
332         } while ( --tries );
333
334         EFAB_ERR ( "Failed to reset mmd %d\n", mmd );
335
336         return -ETIMEDOUT;
337 }
338
339 static int
340 mdio_clause45_links_ok(struct efab_nic *efab )
341 {
342         int status, good;
343         int ok = 1;
344         int mmd = 0;
345         int mmd_mask = efab->phy_op->mmds;
346
347         while (mmd_mask) {
348                 if (mmd_mask & 1) {
349                         /* Double reads because link state is latched, and a
350                          * read moves the current state into the register */
351                         status = falcon_mdio_read ( efab, mmd,
352                                                     MDIO_MMDREG_STAT1 );
353                         status = falcon_mdio_read ( efab, mmd,
354                                                     MDIO_MMDREG_STAT1 );
355
356                         good = status & (1 << MDIO_MMDREG_STAT1_LINK_LBN);
357                         ok = ok && good;
358                 }
359                 mmd_mask = (mmd_mask >> 1);
360                 mmd++;
361         }
362         return ok;
363 }
364
365 static int
366 mdio_clause45_check_mmds ( struct efab_nic *efab )
367 {
368         int mmd = 0;
369         int devices = falcon_mdio_read ( efab, MDIO_MMD_PHYXS,
370                                          MDIO_MMDREG_DEVS0 );
371         int mmd_mask = efab->phy_op->mmds;
372
373         /* Check all the expected MMDs are present */
374         if ( devices < 0 ) {
375                 EFAB_ERR ( "Failed to read devices present\n" );
376                 return -EIO;
377         }
378         if ( ( devices & mmd_mask ) != mmd_mask ) {
379                 EFAB_ERR ( "required MMDs not present: got %x, wanted %x\n",
380                            devices, mmd_mask );
381                 return -EIO;
382         }
383
384         /* Check all required MMDs are responding and happy. */
385         while ( mmd_mask ) {
386                 if ( mmd_mask & 1 ) {
387                         efab_dword_t reg;
388                         int status;
389                         reg.opaque = falcon_mdio_read ( efab, mmd,
390                                                         MDIO_MMDREG_STAT2 );
391                         status = EFAB_DWORD_FIELD ( reg,
392                                                     MDIO_MMDREG_STAT2_PRESENT );
393                         if ( status != MDIO_MMDREG_STAT2_PRESENT_VAL ) {
394
395
396                                 return -EIO;
397                         }
398                 }
399                 mmd_mask >>= 1;
400                 mmd++;
401         }
402
403         return 0;
404 }
405
406 /* I/O BAR address register */
407 #define FCN_IOM_IND_ADR_REG 0x0
408
409 /* I/O BAR data register */
410 #define FCN_IOM_IND_DAT_REG 0x4
411
412 /* Address region register */
413 #define FCN_ADR_REGION_REG_KER  0x00
414 #define FCN_ADR_REGION0_LBN     0
415 #define FCN_ADR_REGION0_WIDTH   18
416 #define FCN_ADR_REGION1_LBN     32
417 #define FCN_ADR_REGION1_WIDTH   18
418 #define FCN_ADR_REGION2_LBN     64
419 #define FCN_ADR_REGION2_WIDTH   18
420 #define FCN_ADR_REGION3_LBN     96
421 #define FCN_ADR_REGION3_WIDTH   18
422
423 /* Interrupt enable register */
424 #define FCN_INT_EN_REG_KER 0x0010
425 #define FCN_MEM_PERR_INT_EN_KER_LBN 5
426 #define FCN_MEM_PERR_INT_EN_KER_WIDTH 1
427 #define FCN_KER_INT_CHAR_LBN 4
428 #define FCN_KER_INT_CHAR_WIDTH 1
429 #define FCN_KER_INT_KER_LBN 3
430 #define FCN_KER_INT_KER_WIDTH 1
431 #define FCN_ILL_ADR_ERR_INT_EN_KER_LBN 2
432 #define FCN_ILL_ADR_ERR_INT_EN_KER_WIDTH 1
433 #define FCN_SRM_PERR_INT_EN_KER_LBN 1
434 #define FCN_SRM_PERR_INT_EN_KER_WIDTH 1
435 #define FCN_DRV_INT_EN_KER_LBN 0
436 #define FCN_DRV_INT_EN_KER_WIDTH 1
437
438 /* Interrupt status register */
439 #define FCN_INT_ADR_REG_KER     0x0030
440 #define FCN_INT_ADR_KER_LBN 0
441 #define FCN_INT_ADR_KER_WIDTH EFAB_DMA_TYPE_WIDTH ( 64 )
442
443 /* Interrupt status register (B0 only) */
444 #define INT_ISR0_B0 0x90
445 #define INT_ISR1_B0 0xA0
446
447 /* Interrupt acknowledge register (A0/A1 only) */
448 #define FCN_INT_ACK_KER_REG_A1 0x0050
449 #define INT_ACK_DUMMY_DATA_LBN 0
450 #define INT_ACK_DUMMY_DATA_WIDTH 32
451
452 /* Interrupt acknowledge work-around register (A0/A1 only )*/
453 #define WORK_AROUND_BROKEN_PCI_READS_REG_KER_A1 0x0070
454
455 /* Hardware initialisation register */
456 #define FCN_HW_INIT_REG_KER 0x00c0
457 #define FCN_BCSR_TARGET_MASK_LBN 101
458 #define FCN_BCSR_TARGET_MASK_WIDTH 4
459
460 /* SPI host command register */
461 #define FCN_EE_SPI_HCMD_REG 0x0100
462 #define FCN_EE_SPI_HCMD_CMD_EN_LBN 31
463 #define FCN_EE_SPI_HCMD_CMD_EN_WIDTH 1
464 #define FCN_EE_WR_TIMER_ACTIVE_LBN 28
465 #define FCN_EE_WR_TIMER_ACTIVE_WIDTH 1
466 #define FCN_EE_SPI_HCMD_SF_SEL_LBN 24
467 #define FCN_EE_SPI_HCMD_SF_SEL_WIDTH 1
468 #define FCN_EE_SPI_EEPROM 0
469 #define FCN_EE_SPI_FLASH 1
470 #define FCN_EE_SPI_HCMD_DABCNT_LBN 16
471 #define FCN_EE_SPI_HCMD_DABCNT_WIDTH 5
472 #define FCN_EE_SPI_HCMD_READ_LBN 15
473 #define FCN_EE_SPI_HCMD_READ_WIDTH 1
474 #define FCN_EE_SPI_READ 1
475 #define FCN_EE_SPI_WRITE 0
476 #define FCN_EE_SPI_HCMD_DUBCNT_LBN 12
477 #define FCN_EE_SPI_HCMD_DUBCNT_WIDTH 2
478 #define FCN_EE_SPI_HCMD_ADBCNT_LBN 8
479 #define FCN_EE_SPI_HCMD_ADBCNT_WIDTH 2
480 #define FCN_EE_SPI_HCMD_ENC_LBN 0
481 #define FCN_EE_SPI_HCMD_ENC_WIDTH 8
482
483 /* SPI host address register */
484 #define FCN_EE_SPI_HADR_REG 0x0110
485 #define FCN_EE_SPI_HADR_DUBYTE_LBN 24
486 #define FCN_EE_SPI_HADR_DUBYTE_WIDTH 8
487 #define FCN_EE_SPI_HADR_ADR_LBN 0
488 #define FCN_EE_SPI_HADR_ADR_WIDTH 24
489
490 /* SPI host data register */
491 #define FCN_EE_SPI_HDATA_REG 0x0120
492 #define FCN_EE_SPI_HDATA3_LBN 96
493 #define FCN_EE_SPI_HDATA3_WIDTH 32
494 #define FCN_EE_SPI_HDATA2_LBN 64
495 #define FCN_EE_SPI_HDATA2_WIDTH 32
496 #define FCN_EE_SPI_HDATA1_LBN 32
497 #define FCN_EE_SPI_HDATA1_WIDTH 32
498 #define FCN_EE_SPI_HDATA0_LBN 0
499 #define FCN_EE_SPI_HDATA0_WIDTH 32
500
501 /* VPD Config 0 Register register */
502 #define FCN_EE_VPD_CFG_REG 0x0140
503 #define FCN_EE_VPD_EN_LBN 0
504 #define FCN_EE_VPD_EN_WIDTH 1
505 #define FCN_EE_VPD_EN_AD9_MODE_LBN 1
506 #define FCN_EE_VPD_EN_AD9_MODE_WIDTH 1
507 #define FCN_EE_EE_CLOCK_DIV_LBN 112
508 #define FCN_EE_EE_CLOCK_DIV_WIDTH 7
509 #define FCN_EE_SF_CLOCK_DIV_LBN 120
510 #define FCN_EE_SF_CLOCK_DIV_WIDTH 7
511
512
513 /* NIC status register */
514 #define FCN_NIC_STAT_REG 0x0200
515 #define FCN_ONCHIP_SRAM_LBN 16
516 #define FCN_ONCHIP_SRAM_WIDTH 1
517 #define FCN_SF_PRST_LBN 9
518 #define FCN_SF_PRST_WIDTH 1
519 #define FCN_EE_PRST_LBN 8
520 #define FCN_EE_PRST_WIDTH 1
521 #define FCN_EE_STRAP_LBN 7
522 #define FCN_EE_STRAP_WIDTH 1
523 #define FCN_PCI_PCIX_MODE_LBN 4
524 #define FCN_PCI_PCIX_MODE_WIDTH 3
525 #define FCN_PCI_PCIX_MODE_PCI33_DECODE 0
526 #define FCN_PCI_PCIX_MODE_PCI66_DECODE 1
527 #define FCN_PCI_PCIX_MODE_PCIX66_DECODE 5
528 #define FCN_PCI_PCIX_MODE_PCIX100_DECODE 6
529 #define FCN_PCI_PCIX_MODE_PCIX133_DECODE 7
530 #define FCN_STRAP_ISCSI_EN_LBN 3
531 #define FCN_STRAP_ISCSI_EN_WIDTH 1
532 #define FCN_STRAP_PINS_LBN 0
533 #define FCN_STRAP_PINS_WIDTH 3
534 #define FCN_STRAP_10G_LBN 2
535 #define FCN_STRAP_10G_WIDTH 1
536 #define FCN_STRAP_DUAL_PORT_LBN 1
537 #define FCN_STRAP_DUAL_PORT_WIDTH 1
538 #define FCN_STRAP_PCIE_LBN 0
539 #define FCN_STRAP_PCIE_WIDTH 1
540
541 /* Falcon revisions */
542 #define FALCON_REV_A0 0
543 #define FALCON_REV_A1 1
544 #define FALCON_REV_B0 2
545
546 /* GPIO control register */
547 #define FCN_GPIO_CTL_REG_KER 0x0210
548 #define FCN_GPIO_CTL_REG_KER 0x0210
549
550 #define FCN_GPIO3_OEN_LBN 27
551 #define FCN_GPIO3_OEN_WIDTH 1
552 #define FCN_GPIO2_OEN_LBN 26
553 #define FCN_GPIO2_OEN_WIDTH 1
554 #define FCN_GPIO1_OEN_LBN 25
555 #define FCN_GPIO1_OEN_WIDTH 1
556 #define FCN_GPIO0_OEN_LBN 24
557 #define FCN_GPIO0_OEN_WIDTH 1
558
559 #define FCN_GPIO3_OUT_LBN 19
560 #define FCN_GPIO3_OUT_WIDTH 1
561 #define FCN_GPIO2_OUT_LBN 18
562 #define FCN_GPIO2_OUT_WIDTH 1
563 #define FCN_GPIO1_OUT_LBN 17
564 #define FCN_GPIO1_OUT_WIDTH 1
565 #define FCN_GPIO0_OUT_LBN 16
566 #define FCN_GPIO0_OUT_WIDTH 1
567
568 #define FCN_GPIO3_IN_LBN 11
569 #define FCN_GPIO3_IN_WIDTH 1
570 #define FCN_GPIO2_IN_LBN 10
571 #define FCN_GPIO2_IN_WIDTH 1
572 #define FCN_GPIO1_IN_LBN 9
573 #define FCN_GPIO1_IN_WIDTH 1
574 #define FCN_GPIO0_IN_LBN 8
575 #define FCN_GPIO0_IN_WIDTH 1
576
577 #define FCN_FLASH_PRESENT_LBN 7
578 #define FCN_FLASH_PRESENT_WIDTH 1
579 #define FCN_EEPROM_PRESENT_LBN 6
580 #define FCN_EEPROM_PRESENT_WIDTH 1
581 #define FCN_BOOTED_USING_NVDEVICE_LBN 3
582 #define FCN_BOOTED_USING_NVDEVICE_WIDTH 1
583
584 /* Defines for extra non-volatile storage */
585 #define FCN_NV_MAGIC_NUMBER 0xFA1C
586
587 /* Global control register */
588 #define FCN_GLB_CTL_REG_KER     0x0220
589 #define FCN_EXT_PHY_RST_CTL_LBN 63
590 #define FCN_EXT_PHY_RST_CTL_WIDTH 1
591 #define FCN_PCIE_SD_RST_CTL_LBN 61
592 #define FCN_PCIE_SD_RST_CTL_WIDTH 1
593 #define FCN_PCIE_STCK_RST_CTL_LBN 59
594 #define FCN_PCIE_STCK_RST_CTL_WIDTH 1
595 #define FCN_PCIE_NSTCK_RST_CTL_LBN 58
596 #define FCN_PCIE_NSTCK_RST_CTL_WIDTH 1
597 #define FCN_PCIE_CORE_RST_CTL_LBN 57
598 #define FCN_PCIE_CORE_RST_CTL_WIDTH 1
599 #define FCN_EE_RST_CTL_LBN 49
600 #define FCN_EE_RST_CTL_WIDTH 1
601 #define FCN_RST_EXT_PHY_LBN 31
602 #define FCN_RST_EXT_PHY_WIDTH 1
603 #define FCN_EXT_PHY_RST_DUR_LBN 1
604 #define FCN_EXT_PHY_RST_DUR_WIDTH 3
605 #define FCN_SWRST_LBN 0
606 #define FCN_SWRST_WIDTH 1
607 #define INCLUDE_IN_RESET 0
608 #define EXCLUDE_FROM_RESET 1
609
610 /* FPGA build version */
611 #define FCN_ALTERA_BUILD_REG_KER 0x0300
612 #define FCN_VER_MAJOR_LBN 24
613 #define FCN_VER_MAJOR_WIDTH 8
614 #define FCN_VER_MINOR_LBN 16
615 #define FCN_VER_MINOR_WIDTH 8
616 #define FCN_VER_BUILD_LBN 0
617 #define FCN_VER_BUILD_WIDTH 16
618 #define FCN_VER_ALL_LBN 0
619 #define FCN_VER_ALL_WIDTH 32
620
621 /* Spare EEPROM bits register (flash 0x390) */
622 #define FCN_SPARE_REG_KER 0x310
623 #define FCN_MEM_PERR_EN_TX_DATA_LBN 72
624 #define FCN_MEM_PERR_EN_TX_DATA_WIDTH 2
625
626 /* Timer table for kernel access */
627 #define FCN_TIMER_CMD_REG_KER 0x420
628 #define FCN_TIMER_MODE_LBN 12
629 #define FCN_TIMER_MODE_WIDTH 2
630 #define FCN_TIMER_MODE_DIS 0
631 #define FCN_TIMER_MODE_INT_HLDOFF 1
632 #define FCN_TIMER_VAL_LBN 0
633 #define FCN_TIMER_VAL_WIDTH 12
634
635 /* Receive configuration register */
636 #define FCN_RX_CFG_REG_KER 0x800
637 #define FCN_RX_XOFF_EN_LBN 0
638 #define FCN_RX_XOFF_EN_WIDTH 1
639
640 /* SRAM receive descriptor cache configuration register */
641 #define FCN_SRM_RX_DC_CFG_REG_KER 0x610
642 #define FCN_SRM_RX_DC_BASE_ADR_LBN 0
643 #define FCN_SRM_RX_DC_BASE_ADR_WIDTH 21
644
645 /* SRAM transmit descriptor cache configuration register */
646 #define FCN_SRM_TX_DC_CFG_REG_KER 0x620
647 #define FCN_SRM_TX_DC_BASE_ADR_LBN 0
648 #define FCN_SRM_TX_DC_BASE_ADR_WIDTH 21
649
650 /* SRAM configuration register */
651 #define FCN_SRM_CFG_REG_KER 0x630
652 #define FCN_SRAM_OOB_ADR_INTEN_LBN 5
653 #define FCN_SRAM_OOB_ADR_INTEN_WIDTH 1
654 #define FCN_SRAM_OOB_BUF_INTEN_LBN 4
655 #define FCN_SRAM_OOB_BUF_INTEN_WIDTH 1
656 #define FCN_SRAM_OOB_BT_INIT_EN_LBN 3
657 #define FCN_SRAM_OOB_BT_INIT_EN_WIDTH 1
658 #define FCN_SRM_NUM_BANK_LBN 2
659 #define FCN_SRM_NUM_BANK_WIDTH 1
660 #define FCN_SRM_BANK_SIZE_LBN 0
661 #define FCN_SRM_BANK_SIZE_WIDTH 2
662 #define FCN_SRM_NUM_BANKS_AND_BANK_SIZE_LBN 0
663 #define FCN_SRM_NUM_BANKS_AND_BANK_SIZE_WIDTH 3
664
665 #define FCN_RX_CFG_REG_KER 0x800
666 #define FCN_RX_INGR_EN_B0_LBN 47
667 #define FCN_RX_INGR_EN_B0_WIDTH 1
668 #define FCN_RX_USR_BUF_SIZE_B0_LBN 19
669 #define FCN_RX_USR_BUF_SIZE_B0_WIDTH 9
670 #define FCN_RX_XON_MAC_TH_B0_LBN 10
671 #define FCN_RX_XON_MAC_TH_B0_WIDTH 9
672 #define FCN_RX_XOFF_MAC_TH_B0_LBN 1
673 #define FCN_RX_XOFF_MAC_TH_B0_WIDTH 9
674 #define FCN_RX_XOFF_MAC_EN_B0_LBN 0
675 #define FCN_RX_XOFF_MAC_EN_B0_WIDTH 1
676 #define FCN_RX_USR_BUF_SIZE_A1_LBN 11
677 #define FCN_RX_USR_BUF_SIZE_A1_WIDTH 9
678 #define FCN_RX_XON_MAC_TH_A1_LBN 6
679 #define FCN_RX_XON_MAC_TH_A1_WIDTH 5
680 #define FCN_RX_XOFF_MAC_TH_A1_LBN 1
681 #define FCN_RX_XOFF_MAC_TH_A1_WIDTH 5
682 #define FCN_RX_XOFF_MAC_EN_A1_LBN 0
683 #define FCN_RX_XOFF_MAC_EN_A1_WIDTH 1
684
685 #define FCN_RX_USR_BUF_SIZE_A1_LBN 11
686 #define FCN_RX_USR_BUF_SIZE_A1_WIDTH 9
687 #define FCN_RX_XOFF_MAC_EN_A1_LBN 0
688 #define FCN_RX_XOFF_MAC_EN_A1_WIDTH 1
689
690 /* Receive filter control register */
691 #define FCN_RX_FILTER_CTL_REG_KER 0x810
692 #define FCN_UDP_FULL_SRCH_LIMIT_LBN 32
693 #define FCN_UDP_FULL_SRCH_LIMIT_WIDTH 8
694 #define FCN_NUM_KER_LBN 24
695 #define FCN_NUM_KER_WIDTH 2
696 #define FCN_UDP_WILD_SRCH_LIMIT_LBN 16
697 #define FCN_UDP_WILD_SRCH_LIMIT_WIDTH 8
698 #define FCN_TCP_WILD_SRCH_LIMIT_LBN 8
699 #define FCN_TCP_WILD_SRCH_LIMIT_WIDTH 8
700 #define FCN_TCP_FULL_SRCH_LIMIT_LBN 0
701 #define FCN_TCP_FULL_SRCH_LIMIT_WIDTH 8
702
703 /* RX queue flush register */
704 #define FCN_RX_FLUSH_DESCQ_REG_KER 0x0820
705 #define FCN_RX_FLUSH_DESCQ_CMD_LBN 24
706 #define FCN_RX_FLUSH_DESCQ_CMD_WIDTH 1
707 #define FCN_RX_FLUSH_DESCQ_LBN 0
708 #define FCN_RX_FLUSH_DESCQ_WIDTH 12
709
710 /* Receive descriptor update register */
711 #define FCN_RX_DESC_UPD_REG_KER 0x0830
712 #define FCN_RX_DESC_WPTR_LBN 96
713 #define FCN_RX_DESC_WPTR_WIDTH 12
714 #define FCN_RX_DESC_UPD_REG_KER_DWORD ( FCN_RX_DESC_UPD_REG_KER + 12 )
715 #define FCN_RX_DESC_WPTR_DWORD_LBN 0
716 #define FCN_RX_DESC_WPTR_DWORD_WIDTH 12
717
718 /* Receive descriptor cache configuration register */
719 #define FCN_RX_DC_CFG_REG_KER 0x840
720 #define FCN_RX_DC_SIZE_LBN 0
721 #define FCN_RX_DC_SIZE_WIDTH 2
722
723 #define FCN_RX_SELF_RST_REG_KER 0x890
724 #define FCN_RX_ISCSI_DIS_LBN 17
725 #define FCN_RX_ISCSI_DIS_WIDTH 1
726 #define FCN_RX_NODESC_WAIT_DIS_LBN 9
727 #define FCN_RX_NODESC_WAIT_DIS_WIDTH 1
728 #define FCN_RX_RECOVERY_EN_LBN 8
729 #define FCN_RX_RECOVERY_EN_WIDTH 1
730
731 /* TX queue flush register */
732 #define FCN_TX_FLUSH_DESCQ_REG_KER 0x0a00
733 #define FCN_TX_FLUSH_DESCQ_CMD_LBN 12
734 #define FCN_TX_FLUSH_DESCQ_CMD_WIDTH 1
735 #define FCN_TX_FLUSH_DESCQ_LBN 0
736 #define FCN_TX_FLUSH_DESCQ_WIDTH 12
737
738 /* Transmit configuration register 2 */
739 #define FCN_TX_CFG2_REG_KER 0xa80
740 #define FCN_TX_DIS_NON_IP_EV_LBN 17
741 #define FCN_TX_DIS_NON_IP_EV_WIDTH 1
742
743 /* Transmit descriptor update register */
744 #define FCN_TX_DESC_UPD_REG_KER 0x0a10
745 #define FCN_TX_DESC_WPTR_LBN 96
746 #define FCN_TX_DESC_WPTR_WIDTH 12
747 #define FCN_TX_DESC_UPD_REG_KER_DWORD ( FCN_TX_DESC_UPD_REG_KER + 12 )
748 #define FCN_TX_DESC_WPTR_DWORD_LBN 0
749 #define FCN_TX_DESC_WPTR_DWORD_WIDTH 12
750
751 /* Transmit descriptor cache configuration register */
752 #define FCN_TX_DC_CFG_REG_KER 0xa20
753 #define FCN_TX_DC_SIZE_LBN 0
754 #define FCN_TX_DC_SIZE_WIDTH 2
755
756 /* PHY management transmit data register */
757 #define FCN_MD_TXD_REG_KER 0xc00
758 #define FCN_MD_TXD_LBN 0
759 #define FCN_MD_TXD_WIDTH 16
760
761 /* PHY management receive data register */
762 #define FCN_MD_RXD_REG_KER 0xc10
763 #define FCN_MD_RXD_LBN 0
764 #define FCN_MD_RXD_WIDTH 16
765
766 /* PHY management configuration & status register */
767 #define FCN_MD_CS_REG_KER 0xc20
768 #define FCN_MD_GC_LBN 4
769 #define FCN_MD_GC_WIDTH 1
770 #define FCN_MD_RIC_LBN 2
771 #define FCN_MD_RIC_WIDTH 1
772 #define FCN_MD_RDC_LBN 1
773 #define FCN_MD_RDC_WIDTH 1
774 #define FCN_MD_WRC_LBN 0
775 #define FCN_MD_WRC_WIDTH 1
776
777 /* PHY management PHY address register */
778 #define FCN_MD_PHY_ADR_REG_KER 0xc30
779 #define FCN_MD_PHY_ADR_LBN 0
780 #define FCN_MD_PHY_ADR_WIDTH 16
781
782 /* PHY management ID register */
783 #define FCN_MD_ID_REG_KER 0xc40
784 #define FCN_MD_PRT_ADR_LBN 11
785 #define FCN_MD_PRT_ADR_WIDTH 5
786 #define FCN_MD_DEV_ADR_LBN 6
787 #define FCN_MD_DEV_ADR_WIDTH 5
788
789 /* PHY management status & mask register */
790 #define FCN_MD_STAT_REG_KER 0xc50
791 #define FCN_MD_PINT_LBN 4
792 #define FCN_MD_PINT_WIDTH 1
793 #define FCN_MD_DONE_LBN 3
794 #define FCN_MD_DONE_WIDTH 1
795 #define FCN_MD_BSERR_LBN 2
796 #define FCN_MD_BSERR_WIDTH 1
797 #define FCN_MD_LNFL_LBN 1
798 #define FCN_MD_LNFL_WIDTH 1
799 #define FCN_MD_BSY_LBN 0
800 #define FCN_MD_BSY_WIDTH 1
801
802 /* Port 0 and 1 MAC control registers */
803 #define FCN_MAC0_CTRL_REG_KER 0xc80
804 #define FCN_MAC1_CTRL_REG_KER 0xc90
805 #define FCN_MAC_XOFF_VAL_LBN 16
806 #define FCN_MAC_XOFF_VAL_WIDTH 16
807 #define FCN_MAC_BCAD_ACPT_LBN 4
808 #define FCN_MAC_BCAD_ACPT_WIDTH 1
809 #define FCN_MAC_UC_PROM_LBN 3
810 #define FCN_MAC_UC_PROM_WIDTH 1
811 #define FCN_MAC_LINK_STATUS_LBN 2
812 #define FCN_MAC_LINK_STATUS_WIDTH 1
813 #define FCN_MAC_SPEED_LBN 0
814 #define FCN_MAC_SPEED_WIDTH 2
815
816 /* 10Gig Xaui XGXS Default Values  */
817 #define XX_TXDRV_DEQ_DEFAULT 0xe /* deq=.6 */
818 #define XX_TXDRV_DTX_DEFAULT 0x5 /* 1.25 */
819 #define XX_SD_CTL_DRV_DEFAULT 0  /* 20mA */
820
821 /* GMAC registers */
822 #define FALCON_GMAC_REGBANK 0xe00
823 #define FALCON_GMAC_REGBANK_SIZE 0x200
824 #define FALCON_GMAC_REG_SIZE 0x10
825
826 /* XGMAC registers */
827 #define FALCON_XMAC_REGBANK 0x1200
828 #define FALCON_XMAC_REGBANK_SIZE 0x200
829 #define FALCON_XMAC_REG_SIZE 0x10
830
831 /* XGMAC address register low */
832 #define FCN_XM_ADR_LO_REG_MAC 0x00
833 #define FCN_XM_ADR_3_LBN 24
834 #define FCN_XM_ADR_3_WIDTH 8
835 #define FCN_XM_ADR_2_LBN 16
836 #define FCN_XM_ADR_2_WIDTH 8
837 #define FCN_XM_ADR_1_LBN 8
838 #define FCN_XM_ADR_1_WIDTH 8
839 #define FCN_XM_ADR_0_LBN 0
840 #define FCN_XM_ADR_0_WIDTH 8
841
842 /* XGMAC address register high */
843 #define FCN_XM_ADR_HI_REG_MAC 0x01
844 #define FCN_XM_ADR_5_LBN 8
845 #define FCN_XM_ADR_5_WIDTH 8
846 #define FCN_XM_ADR_4_LBN 0
847 #define FCN_XM_ADR_4_WIDTH 8
848
849 /* XGMAC global configuration - port 0*/
850 #define FCN_XM_GLB_CFG_REG_MAC 0x02
851 #define FCN_XM_RX_STAT_EN_LBN 11
852 #define FCN_XM_RX_STAT_EN_WIDTH 1
853 #define FCN_XM_TX_STAT_EN_LBN 10
854 #define FCN_XM_TX_STAT_EN_WIDTH 1
855 #define FCN_XM_RX_JUMBO_MODE_LBN 6
856 #define FCN_XM_RX_JUMBO_MODE_WIDTH 1
857 #define FCN_XM_CORE_RST_LBN 0
858 #define FCN_XM_CORE_RST_WIDTH 1
859
860 /* XGMAC transmit configuration - port 0 */
861 #define FCN_XM_TX_CFG_REG_MAC 0x03
862 #define FCN_XM_IPG_LBN 16
863 #define FCN_XM_IPG_WIDTH 4
864 #define FCN_XM_FCNTL_LBN 10
865 #define FCN_XM_FCNTL_WIDTH 1
866 #define FCN_XM_TXCRC_LBN 8
867 #define FCN_XM_TXCRC_WIDTH 1
868 #define FCN_XM_AUTO_PAD_LBN 5
869 #define FCN_XM_AUTO_PAD_WIDTH 1
870 #define FCN_XM_TX_PRMBL_LBN 2
871 #define FCN_XM_TX_PRMBL_WIDTH 1
872 #define FCN_XM_TXEN_LBN 1
873 #define FCN_XM_TXEN_WIDTH 1
874
875 /* XGMAC receive configuration - port 0 */
876 #define FCN_XM_RX_CFG_REG_MAC 0x04
877 #define FCN_XM_PASS_CRC_ERR_LBN 25
878 #define FCN_XM_PASS_CRC_ERR_WIDTH 1
879 #define FCN_XM_AUTO_DEPAD_LBN 8
880 #define FCN_XM_AUTO_DEPAD_WIDTH 1
881 #define FCN_XM_RXEN_LBN 1
882 #define FCN_XM_RXEN_WIDTH 1
883
884 /* XGMAC management interrupt mask register */
885 #define FCN_XM_MGT_INT_MSK_REG_MAC_B0 0x5
886 #define FCN_XM_MSK_PRMBLE_ERR_LBN 2
887 #define FCN_XM_MSK_PRMBLE_ERR_WIDTH 1
888 #define FCN_XM_MSK_RMTFLT_LBN 1
889 #define FCN_XM_MSK_RMTFLT_WIDTH 1
890 #define FCN_XM_MSK_LCLFLT_LBN 0
891 #define FCN_XM_MSK_LCLFLT_WIDTH 1
892
893 /* XGMAC flow control register */
894 #define FCN_XM_FC_REG_MAC 0x7
895 #define FCN_XM_PAUSE_TIME_LBN 16
896 #define FCN_XM_PAUSE_TIME_WIDTH 16
897 #define FCN_XM_DIS_FCNTL_LBN 0
898 #define FCN_XM_DIS_FCNTL_WIDTH 1
899
900 /* XGMAC transmit parameter register */
901 #define FCN_XM_TX_PARAM_REG_MAC 0x0d
902 #define FCN_XM_TX_JUMBO_MODE_LBN 31
903 #define FCN_XM_TX_JUMBO_MODE_WIDTH 1
904 #define FCN_XM_MAX_TX_FRM_SIZE_LBN 16
905 #define FCN_XM_MAX_TX_FRM_SIZE_WIDTH 14
906 #define FCN_XM_ACPT_ALL_MCAST_LBN 11
907 #define FCN_XM_ACPT_ALL_MCAST_WIDTH 1
908
909 /* XGMAC receive parameter register */
910 #define FCN_XM_RX_PARAM_REG_MAC 0x0e
911 #define FCN_XM_MAX_RX_FRM_SIZE_LBN 0
912 #define FCN_XM_MAX_RX_FRM_SIZE_WIDTH 14
913
914 /* XGMAC management interrupt status register */
915 #define FCN_XM_MGT_INT_REG_MAC_B0 0x0f
916 #define FCN_XM_PRMBLE_ERR 2
917 #define FCN_XM_PRMBLE_WIDTH 1
918 #define FCN_XM_RMTFLT_LBN 1
919 #define FCN_XM_RMTFLT_WIDTH 1
920 #define FCN_XM_LCLFLT_LBN 0
921 #define FCN_XM_LCLFLT_WIDTH 1
922
923 /* XAUI XGXS core status register */
924 #define FCN_XX_ALIGN_DONE_LBN 20
925 #define FCN_XX_ALIGN_DONE_WIDTH 1
926 #define FCN_XX_CORE_STAT_REG_MAC 0x16
927 #define FCN_XX_SYNC_STAT_LBN 16
928 #define FCN_XX_SYNC_STAT_WIDTH 4
929 #define FCN_XX_SYNC_STAT_DECODE_SYNCED 0xf
930 #define FCN_XX_COMMA_DET_LBN 12
931 #define FCN_XX_COMMA_DET_WIDTH 4
932 #define FCN_XX_COMMA_DET_RESET 0xf
933 #define FCN_XX_CHARERR_LBN 4
934 #define FCN_XX_CHARERR_WIDTH 4
935 #define FCN_XX_CHARERR_RESET 0xf
936 #define FCN_XX_DISPERR_LBN 0
937 #define FCN_XX_DISPERR_WIDTH 4
938 #define FCN_XX_DISPERR_RESET 0xf
939
940 /* XGXS/XAUI powerdown/reset register */
941 #define FCN_XX_PWR_RST_REG_MAC 0x10
942 #define FCN_XX_PWRDND_EN_LBN 15
943 #define FCN_XX_PWRDND_EN_WIDTH 1
944 #define FCN_XX_PWRDNC_EN_LBN 14
945 #define FCN_XX_PWRDNC_EN_WIDTH 1
946 #define FCN_XX_PWRDNB_EN_LBN 13
947 #define FCN_XX_PWRDNB_EN_WIDTH 1
948 #define FCN_XX_PWRDNA_EN_LBN 12
949 #define FCN_XX_PWRDNA_EN_WIDTH 1
950 #define FCN_XX_RSTPLLCD_EN_LBN 9
951 #define FCN_XX_RSTPLLCD_EN_WIDTH 1
952 #define FCN_XX_RSTPLLAB_EN_LBN 8
953 #define FCN_XX_RSTPLLAB_EN_WIDTH 1
954 #define FCN_XX_RESETD_EN_LBN 7
955 #define FCN_XX_RESETD_EN_WIDTH 1
956 #define FCN_XX_RESETC_EN_LBN 6
957 #define FCN_XX_RESETC_EN_WIDTH 1
958 #define FCN_XX_RESETB_EN_LBN 5
959 #define FCN_XX_RESETB_EN_WIDTH 1
960 #define FCN_XX_RESETA_EN_LBN 4
961 #define FCN_XX_RESETA_EN_WIDTH 1
962 #define FCN_XX_RSTXGXSRX_EN_LBN 2
963 #define FCN_XX_RSTXGXSRX_EN_WIDTH 1
964 #define FCN_XX_RSTXGXSTX_EN_LBN 1
965 #define FCN_XX_RSTXGXSTX_EN_WIDTH 1
966 #define FCN_XX_RST_XX_EN_LBN 0
967 #define FCN_XX_RST_XX_EN_WIDTH 1
968
969
970 /* XGXS/XAUI powerdown/reset control register */
971 #define FCN_XX_SD_CTL_REG_MAC 0x11
972 #define FCN_XX_TERMADJ1_LBN 17
973 #define FCN_XX_TERMADJ1_WIDTH 1
974 #define FCN_XX_TERMADJ0_LBN 16
975 #define FCN_XX_TERMADJ0_WIDTH 1
976 #define FCN_XX_HIDRVD_LBN 15
977 #define FCN_XX_HIDRVD_WIDTH 1
978 #define FCN_XX_LODRVD_LBN 14
979 #define FCN_XX_LODRVD_WIDTH 1
980 #define FCN_XX_HIDRVC_LBN 13
981 #define FCN_XX_HIDRVC_WIDTH 1
982 #define FCN_XX_LODRVC_LBN 12
983 #define FCN_XX_LODRVC_WIDTH 1
984 #define FCN_XX_HIDRVB_LBN 11
985 #define FCN_XX_HIDRVB_WIDTH 1
986 #define FCN_XX_LODRVB_LBN 10
987 #define FCN_XX_LODRVB_WIDTH 1
988 #define FCN_XX_HIDRVA_LBN 9
989 #define FCN_XX_HIDRVA_WIDTH 1
990 #define FCN_XX_LODRVA_LBN 8
991 #define FCN_XX_LODRVA_WIDTH 1
992 #define FCN_XX_LPBKD_LBN 3
993 #define FCN_XX_LPBKD_WIDTH 1
994 #define FCN_XX_LPBKC_LBN 2
995 #define FCN_XX_LPBKC_WIDTH 1
996 #define FCN_XX_LPBKB_LBN 1
997 #define FCN_XX_LPBKB_WIDTH 1
998 #define FCN_XX_LPBKA_LBN 0
999 #define FCN_XX_LPBKA_WIDTH 1
1000
1001 #define FCN_XX_TXDRV_CTL_REG_MAC 0x12
1002 #define FCN_XX_DEQD_LBN 28
1003 #define FCN_XX_DEQD_WIDTH 4
1004 #define FCN_XX_DEQC_LBN 24
1005 #define FCN_XX_DEQC_WIDTH 4
1006 #define FCN_XX_DEQB_LBN 20
1007 #define FCN_XX_DEQB_WIDTH 4
1008 #define FCN_XX_DEQA_LBN 16
1009 #define FCN_XX_DEQA_WIDTH 4
1010 #define FCN_XX_DTXD_LBN 12
1011 #define FCN_XX_DTXD_WIDTH 4
1012 #define FCN_XX_DTXC_LBN 8
1013 #define FCN_XX_DTXC_WIDTH 4
1014 #define FCN_XX_DTXB_LBN 4
1015 #define FCN_XX_DTXB_WIDTH 4
1016 #define FCN_XX_DTXA_LBN 0
1017 #define FCN_XX_DTXA_WIDTH 4
1018
1019 /* Receive filter table */
1020 #define FCN_RX_FILTER_TBL0 0xF00000 
1021
1022 /* Receive descriptor pointer table */
1023 #define FCN_RX_DESC_PTR_TBL_KER_A1 0x11800
1024 #define FCN_RX_DESC_PTR_TBL_KER_B0 0xF40000
1025 #define FCN_RX_ISCSI_DDIG_EN_LBN 88
1026 #define FCN_RX_ISCSI_DDIG_EN_WIDTH 1
1027 #define FCN_RX_ISCSI_HDIG_EN_LBN 87
1028 #define FCN_RX_ISCSI_HDIG_EN_WIDTH 1
1029 #define FCN_RX_DESCQ_BUF_BASE_ID_LBN 36
1030 #define FCN_RX_DESCQ_BUF_BASE_ID_WIDTH 20
1031 #define FCN_RX_DESCQ_EVQ_ID_LBN 24
1032 #define FCN_RX_DESCQ_EVQ_ID_WIDTH 12
1033 #define FCN_RX_DESCQ_OWNER_ID_LBN 10
1034 #define FCN_RX_DESCQ_OWNER_ID_WIDTH 14
1035 #define FCN_RX_DESCQ_SIZE_LBN 3
1036 #define FCN_RX_DESCQ_SIZE_WIDTH 2
1037 #define FCN_RX_DESCQ_SIZE_4K 3
1038 #define FCN_RX_DESCQ_SIZE_2K 2
1039 #define FCN_RX_DESCQ_SIZE_1K 1
1040 #define FCN_RX_DESCQ_SIZE_512 0
1041 #define FCN_RX_DESCQ_TYPE_LBN 2
1042 #define FCN_RX_DESCQ_TYPE_WIDTH 1
1043 #define FCN_RX_DESCQ_JUMBO_LBN 1
1044 #define FCN_RX_DESCQ_JUMBO_WIDTH 1
1045 #define FCN_RX_DESCQ_EN_LBN 0
1046 #define FCN_RX_DESCQ_EN_WIDTH 1
1047
1048 /* Transmit descriptor pointer table */
1049 #define FCN_TX_DESC_PTR_TBL_KER_A1 0x11900
1050 #define FCN_TX_DESC_PTR_TBL_KER_B0 0xF50000
1051 #define FCN_TX_NON_IP_DROP_DIS_B0_LBN 91
1052 #define FCN_TX_NON_IP_DROP_DIS_B0_WIDTH 1
1053 #define FCN_TX_DESCQ_EN_LBN 88
1054 #define FCN_TX_DESCQ_EN_WIDTH 1
1055 #define FCN_TX_ISCSI_DDIG_EN_LBN 87
1056 #define FCN_TX_ISCSI_DDIG_EN_WIDTH 1
1057 #define FCN_TX_ISCSI_HDIG_EN_LBN 86
1058 #define FCN_TX_ISCSI_HDIG_EN_WIDTH 1
1059 #define FCN_TX_DESCQ_BUF_BASE_ID_LBN 36
1060 #define FCN_TX_DESCQ_BUF_BASE_ID_WIDTH 20
1061 #define FCN_TX_DESCQ_EVQ_ID_LBN 24
1062 #define FCN_TX_DESCQ_EVQ_ID_WIDTH 12
1063 #define FCN_TX_DESCQ_OWNER_ID_LBN 10
1064 #define FCN_TX_DESCQ_OWNER_ID_WIDTH 14
1065 #define FCN_TX_DESCQ_SIZE_LBN 3
1066 #define FCN_TX_DESCQ_SIZE_WIDTH 2
1067 #define FCN_TX_DESCQ_SIZE_4K 3
1068 #define FCN_TX_DESCQ_SIZE_2K 2
1069 #define FCN_TX_DESCQ_SIZE_1K 1
1070 #define FCN_TX_DESCQ_SIZE_512 0
1071 #define FCN_TX_DESCQ_TYPE_LBN 1
1072 #define FCN_TX_DESCQ_TYPE_WIDTH 2
1073 #define FCN_TX_DESCQ_FLUSH_LBN 0
1074 #define FCN_TX_DESCQ_FLUSH_WIDTH 1
1075
1076 /* Event queue pointer */
1077 #define FCN_EVQ_PTR_TBL_KER_A1 0x11a00
1078 #define FCN_EVQ_PTR_TBL_KER_B0 0xf60000
1079 #define FCN_EVQ_EN_LBN 23
1080 #define FCN_EVQ_EN_WIDTH 1
1081 #define FCN_EVQ_SIZE_LBN 20
1082 #define FCN_EVQ_SIZE_WIDTH 3
1083 #define FCN_EVQ_SIZE_32K 6
1084 #define FCN_EVQ_SIZE_16K 5
1085 #define FCN_EVQ_SIZE_8K 4
1086 #define FCN_EVQ_SIZE_4K 3
1087 #define FCN_EVQ_SIZE_2K 2
1088 #define FCN_EVQ_SIZE_1K 1
1089 #define FCN_EVQ_SIZE_512 0
1090 #define FCN_EVQ_BUF_BASE_ID_LBN 0
1091 #define FCN_EVQ_BUF_BASE_ID_WIDTH 20
1092
1093 /* RSS indirection table */
1094 #define FCN_RX_RSS_INDIR_TBL_B0 0xFB0000
1095
1096 /* Event queue read pointer */
1097 #define FCN_EVQ_RPTR_REG_KER_A1 0x11b00
1098 #define FCN_EVQ_RPTR_REG_KER_B0 0xfa0000
1099 #define FCN_EVQ_RPTR_LBN 0
1100 #define FCN_EVQ_RPTR_WIDTH 14
1101 #define FCN_EVQ_RPTR_REG_KER_DWORD_A1 ( FCN_EVQ_RPTR_REG_KER_A1 + 0 )
1102 #define FCN_EVQ_RPTR_REG_KER_DWORD_B0 ( FCN_EVQ_RPTR_REG_KER_B0 + 0 )
1103 #define FCN_EVQ_RPTR_DWORD_LBN 0
1104 #define FCN_EVQ_RPTR_DWORD_WIDTH 14
1105
1106 /* Special buffer descriptors */
1107 #define FCN_BUF_FULL_TBL_KER_A1 0x18000
1108 #define FCN_BUF_FULL_TBL_KER_B0 0x800000
1109 #define FCN_IP_DAT_BUF_SIZE_LBN 50
1110 #define FCN_IP_DAT_BUF_SIZE_WIDTH 1
1111 #define FCN_IP_DAT_BUF_SIZE_8K 1
1112 #define FCN_IP_DAT_BUF_SIZE_4K 0
1113 #define FCN_BUF_ADR_FBUF_LBN 14
1114 #define FCN_BUF_ADR_FBUF_WIDTH 34
1115 #define FCN_BUF_OWNER_ID_FBUF_LBN 0
1116 #define FCN_BUF_OWNER_ID_FBUF_WIDTH 14
1117
1118 /** Offset of a GMAC register within Falcon */
1119 #define FALCON_GMAC_REG( efab, mac_reg )                                \
1120         ( FALCON_GMAC_REGBANK +                                 \
1121           ( (mac_reg) * FALCON_GMAC_REG_SIZE ) )
1122
1123 /** Offset of an XMAC register within Falcon */
1124 #define FALCON_XMAC_REG( efab_port, mac_reg )                   \
1125         ( FALCON_XMAC_REGBANK +                                 \
1126           ( (mac_reg) * FALCON_XMAC_REG_SIZE ) )
1127
1128 #define FCN_MAC_DATA_LBN 0
1129 #define FCN_MAC_DATA_WIDTH 32
1130
1131 /* Transmit descriptor */
1132 #define FCN_TX_KER_PORT_LBN 63
1133 #define FCN_TX_KER_PORT_WIDTH 1
1134 #define FCN_TX_KER_BYTE_CNT_LBN 48
1135 #define FCN_TX_KER_BYTE_CNT_WIDTH 14
1136 #define FCN_TX_KER_BUF_ADR_LBN 0
1137 #define FCN_TX_KER_BUF_ADR_WIDTH EFAB_DMA_TYPE_WIDTH ( 46 )
1138
1139
1140 /* Receive descriptor */
1141 #define FCN_RX_KER_BUF_SIZE_LBN 48
1142 #define FCN_RX_KER_BUF_SIZE_WIDTH 14
1143 #define FCN_RX_KER_BUF_ADR_LBN 0
1144 #define FCN_RX_KER_BUF_ADR_WIDTH EFAB_DMA_TYPE_WIDTH ( 46 )
1145
1146 /* Event queue entries */
1147 #define FCN_EV_CODE_LBN 60
1148 #define FCN_EV_CODE_WIDTH 4
1149 #define FCN_RX_IP_EV_DECODE 0
1150 #define FCN_TX_IP_EV_DECODE 2
1151 #define FCN_DRIVER_EV_DECODE 5
1152
1153 /* Receive events */
1154 #define FCN_RX_EV_PKT_OK_LBN 56
1155 #define FCN_RX_EV_PKT_OK_WIDTH 1
1156 #define FCN_RX_PORT_LBN 30
1157 #define FCN_RX_PORT_WIDTH 1
1158 #define FCN_RX_EV_BYTE_CNT_LBN 16
1159 #define FCN_RX_EV_BYTE_CNT_WIDTH 14
1160 #define FCN_RX_EV_DESC_PTR_LBN 0
1161 #define FCN_RX_EV_DESC_PTR_WIDTH 12
1162
1163 /* Transmit events */
1164 #define FCN_TX_EV_DESC_PTR_LBN 0
1165 #define FCN_TX_EV_DESC_PTR_WIDTH 12
1166
1167 /*******************************************************************************
1168  *
1169  *
1170  * Low-level hardware access
1171  *
1172  *
1173  *******************************************************************************/ 
1174
1175 #define FCN_REVISION_REG(efab, reg) \
1176         ( ( efab->pci_revision == FALCON_REV_B0 ) ? reg ## _B0 : reg ## _A1 )
1177
1178 #define EFAB_SET_OWORD_FIELD_VER(efab, reg, field, val)                 \
1179         if ( efab->pci_revision == FALCON_REV_B0 )                      \
1180                 EFAB_SET_OWORD_FIELD ( reg, field ## _B0, val );        \
1181         else                                                            \
1182                 EFAB_SET_OWORD_FIELD ( reg, field ## _A1, val );
1183
1184 #if FALCON_USE_IO_BAR
1185
1186 /* Write dword via the I/O BAR */
1187 static inline void _falcon_writel ( struct efab_nic *efab, uint32_t value,
1188                                     unsigned int reg ) {
1189         outl ( reg, efab->iobase + FCN_IOM_IND_ADR_REG );
1190         outl ( value, efab->iobase + FCN_IOM_IND_DAT_REG );
1191 }
1192
1193 /* Read dword via the I/O BAR */
1194 static inline uint32_t _falcon_readl ( struct efab_nic *efab,
1195                                        unsigned int reg ) {
1196         outl ( reg, efab->iobase + FCN_IOM_IND_ADR_REG );
1197         return inl ( efab->iobase + FCN_IOM_IND_DAT_REG );
1198 }
1199
1200 #else /* FALCON_USE_IO_BAR */
1201
1202 #define _falcon_writel( efab, value, reg ) \
1203         writel ( (value), (efab)->membase + (reg) )
1204 #define _falcon_readl( efab, reg ) readl ( (efab)->membase + (reg) )
1205
1206 #endif /* FALCON_USE_IO_BAR */
1207
1208 /**
1209  * Write to a Falcon register
1210  *
1211  */
1212 static inline void
1213 falcon_write ( struct efab_nic *efab, efab_oword_t *value, unsigned int reg )
1214 {
1215
1216         EFAB_REGDUMP ( "Writing register %x with " EFAB_OWORD_FMT "\n",
1217                        reg, EFAB_OWORD_VAL ( *value ) );
1218
1219         _falcon_writel ( efab, value->u32[0], reg + 0  );
1220         _falcon_writel ( efab, value->u32[1], reg + 4  );
1221         _falcon_writel ( efab, value->u32[2], reg + 8  );
1222         wmb();
1223         _falcon_writel ( efab, value->u32[3], reg + 12 );
1224         wmb();
1225 }
1226
1227 /**
1228  * Write to Falcon SRAM
1229  *
1230  */
1231 static inline void
1232 falcon_write_sram ( struct efab_nic *efab, efab_qword_t *value,
1233                     unsigned int index )
1234 {
1235         unsigned int reg = ( FCN_REVISION_REG ( efab, FCN_BUF_FULL_TBL_KER ) +
1236                              ( index * sizeof ( *value ) ) );
1237
1238         EFAB_REGDUMP ( "Writing SRAM register %x with " EFAB_QWORD_FMT "\n",
1239                        reg, EFAB_QWORD_VAL ( *value ) );
1240
1241         _falcon_writel ( efab, value->u32[0], reg + 0  );
1242         _falcon_writel ( efab, value->u32[1], reg + 4  );
1243         wmb();
1244 }
1245
1246 /**
1247  * Write dword to Falcon register that allows partial writes
1248  *
1249  */
1250 static inline void
1251 falcon_writel ( struct efab_nic *efab, efab_dword_t *value, unsigned int reg )
1252 {
1253         EFAB_REGDUMP ( "Writing partial register %x with " EFAB_DWORD_FMT "\n",
1254                        reg, EFAB_DWORD_VAL ( *value ) );
1255         _falcon_writel ( efab, value->u32[0], reg );
1256 }
1257
1258 /**
1259  * Read from a Falcon register
1260  *
1261  */
1262 static inline void
1263 falcon_read ( struct efab_nic *efab, efab_oword_t *value, unsigned int reg )
1264 {
1265         value->u32[0] = _falcon_readl ( efab, reg + 0  );
1266         wmb();
1267         value->u32[1] = _falcon_readl ( efab, reg + 4  );
1268         value->u32[2] = _falcon_readl ( efab, reg + 8  );
1269         value->u32[3] = _falcon_readl ( efab, reg + 12 );
1270
1271         EFAB_REGDUMP ( "Read from register %x, got " EFAB_OWORD_FMT "\n",
1272                        reg, EFAB_OWORD_VAL ( *value ) );
1273 }
1274
1275 /** 
1276  * Read from Falcon SRAM
1277  *
1278  */
1279 static inline void
1280 falcon_read_sram ( struct efab_nic *efab, efab_qword_t *value,
1281                    unsigned int index )
1282 {
1283         unsigned int reg = ( FCN_REVISION_REG ( efab, FCN_BUF_FULL_TBL_KER ) +
1284                              ( index * sizeof ( *value ) ) );
1285
1286         value->u32[0] = _falcon_readl ( efab, reg + 0 );
1287         value->u32[1] = _falcon_readl ( efab, reg + 4 );
1288         EFAB_REGDUMP ( "Read from SRAM register %x, got " EFAB_QWORD_FMT "\n",
1289                        reg, EFAB_QWORD_VAL ( *value ) );
1290 }
1291
1292 /**
1293  * Read dword from a portion of a Falcon register
1294  *
1295  */
1296 static inline void
1297 falcon_readl ( struct efab_nic *efab, efab_dword_t *value, unsigned int reg )
1298 {
1299         value->u32[0] = _falcon_readl ( efab, reg );
1300         EFAB_REGDUMP ( "Read from register %x, got " EFAB_DWORD_FMT "\n",
1301                        reg, EFAB_DWORD_VAL ( *value ) );
1302 }
1303
1304 #define FCN_DUMP_REG( efab, _reg ) do {                         \
1305                 efab_oword_t reg;                               \
1306                 falcon_read ( efab, &reg, _reg );               \
1307                 EFAB_LOG ( #_reg " = " EFAB_OWORD_FMT "\n",     \
1308                            EFAB_OWORD_VAL ( reg ) );            \
1309         } while ( 0 );
1310
1311 #define FCN_DUMP_MAC_REG( efab, _mac_reg ) do {                         \
1312                 efab_dword_t reg;                                       \
1313                 efab->mac_op->mac_readl ( efab, &reg, _mac_reg );       \
1314                 EFAB_LOG ( #_mac_reg " = " EFAB_DWORD_FMT "\n",         \
1315                            EFAB_DWORD_VAL ( reg ) );                    \
1316         } while ( 0 );
1317
1318 /**
1319  * See if an event is present
1320  *
1321  * @v event             Falcon event structure
1322  * @ret True            An event is pending
1323  * @ret False           No event is pending
1324  *
1325  * We check both the high and low dword of the event for all ones.  We
1326  * wrote all ones when we cleared the event, and no valid event can
1327  * have all ones in either its high or low dwords.  This approach is
1328  * robust against reordering.
1329  *
1330  * Note that using a single 64-bit comparison is incorrect; even
1331  * though the CPU read will be atomic, the DMA write may not be.
1332  */
1333 static inline int
1334 falcon_event_present ( falcon_event_t* event )
1335 {
1336         return ( ! ( EFAB_DWORD_IS_ALL_ONES ( event->dword[0] ) |
1337                      EFAB_DWORD_IS_ALL_ONES ( event->dword[1] ) ) );
1338 }
1339
1340 static void
1341 falcon_eventq_read_ack ( struct efab_nic *efab, struct efab_ev_queue *ev_queue )
1342 {
1343         efab_dword_t reg;
1344
1345         EFAB_POPULATE_DWORD_1 ( reg, FCN_EVQ_RPTR_DWORD, ev_queue->read_ptr );
1346         falcon_writel ( efab, &reg,
1347                         FCN_REVISION_REG ( efab, FCN_EVQ_RPTR_REG_KER_DWORD ) );
1348 }
1349
1350 #if 0
1351 /**
1352  * Dump register contents (for debugging)
1353  *
1354  * Marked as static inline so that it will not be compiled in if not
1355  * used.
1356  */
1357 static inline void
1358 falcon_dump_regs ( struct efab_nic *efab )
1359 {
1360         FCN_DUMP_REG ( efab, FCN_INT_EN_REG_KER );
1361         FCN_DUMP_REG ( efab, FCN_INT_ADR_REG_KER );
1362         FCN_DUMP_REG ( efab, FCN_GLB_CTL_REG_KER );
1363         FCN_DUMP_REG ( efab, FCN_TIMER_CMD_REG_KER );
1364         FCN_DUMP_REG ( efab, FCN_SRM_RX_DC_CFG_REG_KER );
1365         FCN_DUMP_REG ( efab, FCN_SRM_TX_DC_CFG_REG_KER );
1366         FCN_DUMP_REG ( efab, FCN_RX_FILTER_CTL_REG_KER );
1367         FCN_DUMP_REG ( efab, FCN_RX_DC_CFG_REG_KER );
1368         FCN_DUMP_REG ( efab, FCN_TX_DC_CFG_REG_KER );
1369         FCN_DUMP_REG ( efab, FCN_MAC0_CTRL_REG_KER );
1370         FCN_DUMP_REG ( efab, FCN_MAC1_CTRL_REG_KER );
1371         FCN_DUMP_REG ( efab, FCN_REVISION_REG ( efab, FCN_RX_DESC_PTR_TBL_KER ) );
1372         FCN_DUMP_REG ( efab, FCN_REVISION_REG ( efab, FCN_TX_DESC_PTR_TBL_KER ) );
1373         FCN_DUMP_REG ( efab, FCN_REVISION_REG ( efab, FCN_EVQ_PTR_TBL_KER ) );
1374         FCN_DUMP_MAC_REG ( efab, GM_CFG1_REG_MAC );
1375         FCN_DUMP_MAC_REG ( efab, GM_CFG2_REG_MAC );
1376         FCN_DUMP_MAC_REG ( efab, GM_MAX_FLEN_REG_MAC );
1377         FCN_DUMP_MAC_REG ( efab, GM_MII_MGMT_CFG_REG_MAC );
1378         FCN_DUMP_MAC_REG ( efab, GM_ADR1_REG_MAC );
1379         FCN_DUMP_MAC_REG ( efab, GM_ADR2_REG_MAC );
1380         FCN_DUMP_MAC_REG ( efab, GMF_CFG0_REG_MAC );
1381         FCN_DUMP_MAC_REG ( efab, GMF_CFG1_REG_MAC );
1382         FCN_DUMP_MAC_REG ( efab, GMF_CFG2_REG_MAC );
1383         FCN_DUMP_MAC_REG ( efab, GMF_CFG3_REG_MAC );
1384         FCN_DUMP_MAC_REG ( efab, GMF_CFG4_REG_MAC );
1385         FCN_DUMP_MAC_REG ( efab, GMF_CFG5_REG_MAC );
1386 }
1387 #endif
1388
1389 static void
1390 falcon_interrupts ( struct efab_nic *efab, int enabled, int force )
1391 {
1392         efab_oword_t int_en_reg_ker;
1393
1394         EFAB_POPULATE_OWORD_2 ( int_en_reg_ker,
1395                                 FCN_KER_INT_KER, force,
1396                                 FCN_DRV_INT_EN_KER, enabled );
1397         falcon_write ( efab, &int_en_reg_ker, FCN_INT_EN_REG_KER );     
1398 }
1399
1400 /*******************************************************************************
1401  *
1402  *
1403  * SPI access
1404  *
1405  *
1406  *******************************************************************************/ 
1407
1408
1409 /** Maximum length for a single SPI transaction */
1410 #define FALCON_SPI_MAX_LEN 16
1411
1412 static int
1413 falcon_spi_wait ( struct efab_nic *efab )
1414 {
1415         efab_oword_t reg;
1416         int count;
1417
1418         count = 0;
1419         do {
1420                 udelay ( 100 );
1421                 falcon_read ( efab, &reg, FCN_EE_SPI_HCMD_REG );
1422                 if ( EFAB_OWORD_FIELD ( reg, FCN_EE_SPI_HCMD_CMD_EN ) == 0 )
1423                         return 0;
1424         } while ( ++count < 1000 );
1425
1426         EFAB_ERR ( "Timed out waiting for SPI\n" );
1427         return -ETIMEDOUT;
1428 }
1429
1430 static int
1431 falcon_spi_rw ( struct spi_bus* bus, struct spi_device *device,
1432                 unsigned int command, int address,
1433                 const void* data_out, void *data_in, size_t len )
1434 {
1435         struct efab_nic *efab = container_of ( bus, struct efab_nic, spi_bus );
1436         int address_len, rc, device_id, read_cmd;
1437         efab_oword_t reg;
1438
1439         /* falcon_init_spi_device() should have reduced the block size
1440          * down so this constraint holds */
1441         assert ( len <= FALCON_SPI_MAX_LEN );
1442
1443         /* Is this the FLASH or EEPROM device? */
1444         if ( device == &efab->spi_flash )
1445                 device_id = FCN_EE_SPI_FLASH;
1446         else if ( device == &efab->spi_eeprom )
1447                 device_id = FCN_EE_SPI_EEPROM;
1448         else {
1449                 EFAB_ERR ( "Unknown device %p\n", device );
1450                 return -EINVAL;
1451         }
1452
1453         EFAB_TRACE ( "Executing spi command %d on device %d at %d for %zd bytes\n",
1454                      command, device_id, address, len );
1455
1456         /* The bus must be idle */
1457         rc = falcon_spi_wait ( efab );
1458         if ( rc )
1459                 goto fail1;
1460
1461         /* Copy data out */
1462         if ( data_out ) {
1463                 memcpy ( &reg, data_out, len );
1464                 falcon_write ( efab, &reg, FCN_EE_SPI_HDATA_REG );
1465         }
1466
1467         /* Program address register */
1468         if ( address >= 0 ) {
1469                 EFAB_POPULATE_OWORD_1 ( reg, FCN_EE_SPI_HADR_ADR, address );
1470                 falcon_write ( efab, &reg, FCN_EE_SPI_HADR_REG );
1471         }
1472
1473         /* Issue command */
1474         address_len = ( address >= 0 ) ? device->address_len / 8 : 0;
1475         read_cmd = ( data_in ? FCN_EE_SPI_READ : FCN_EE_SPI_WRITE );
1476         EFAB_POPULATE_OWORD_7 ( reg,
1477                                 FCN_EE_SPI_HCMD_CMD_EN, 1,
1478                                 FCN_EE_SPI_HCMD_SF_SEL, device_id,
1479                                 FCN_EE_SPI_HCMD_DABCNT, len,
1480                                 FCN_EE_SPI_HCMD_READ, read_cmd,
1481                                 FCN_EE_SPI_HCMD_DUBCNT, 0,
1482                                 FCN_EE_SPI_HCMD_ADBCNT, address_len,
1483                                 FCN_EE_SPI_HCMD_ENC, command );
1484         falcon_write ( efab, &reg, FCN_EE_SPI_HCMD_REG );
1485
1486         /* Wait for the command to complete */
1487         rc = falcon_spi_wait ( efab );
1488         if ( rc )
1489                 goto fail2;
1490
1491         /* Copy data in */
1492         if ( data_in ) {
1493                 falcon_read ( efab, &reg, FCN_EE_SPI_HDATA_REG );
1494                 memcpy ( data_in, &reg, len );
1495         }
1496
1497         return 0;
1498
1499 fail2:
1500 fail1:
1501         EFAB_ERR ( "Failed SPI command %d to device %d address 0x%x len 0x%zx\n",
1502                    command, device_id, address, len );
1503
1504         return rc;
1505 }
1506
1507 /** Portion of EEPROM available for non-volatile options */
1508 static struct nvo_fragment falcon_nvo_fragments[] = {
1509         { 0x100, 0xf0 },
1510         { 0, 0 }
1511 };
1512
1513 /*******************************************************************************
1514  *
1515  *
1516  * Falcon bit-bashed I2C interface
1517  *
1518  *
1519  *******************************************************************************/ 
1520
1521 static void
1522 falcon_i2c_bit_write ( struct bit_basher *basher, unsigned int bit_id,
1523                        unsigned long data )
1524 {
1525         struct efab_nic *efab = container_of ( basher, struct efab_nic,
1526                                                i2c_bb.basher );
1527         efab_oword_t reg;
1528
1529         falcon_read ( efab, &reg, FCN_GPIO_CTL_REG_KER );
1530         switch ( bit_id ) {
1531         case I2C_BIT_SCL:
1532                 EFAB_SET_OWORD_FIELD ( reg, FCN_GPIO0_OEN, ( data ? 0 : 1 ) );
1533                 break;
1534         case I2C_BIT_SDA:
1535                 EFAB_SET_OWORD_FIELD ( reg, FCN_GPIO3_OEN, ( data ? 0 : 1 ) );
1536                 break;
1537         default:
1538                 EFAB_ERR ( "%s bit=%d\n", __func__, bit_id );
1539                 break;
1540         }
1541
1542         falcon_write ( efab, &reg,  FCN_GPIO_CTL_REG_KER );
1543 }
1544
1545 static int
1546 falcon_i2c_bit_read ( struct bit_basher *basher, unsigned int bit_id )
1547 {
1548         struct efab_nic *efab = container_of ( basher, struct efab_nic,
1549                                                i2c_bb.basher );
1550         efab_oword_t reg;
1551         
1552         falcon_read ( efab, &reg, FCN_GPIO_CTL_REG_KER );
1553         switch ( bit_id ) {
1554         case I2C_BIT_SCL:
1555                 return EFAB_OWORD_FIELD ( reg, FCN_GPIO0_IN );
1556                 break;
1557         case I2C_BIT_SDA:
1558                 return EFAB_OWORD_FIELD ( reg, FCN_GPIO3_IN );
1559                 break;
1560         default:
1561                 EFAB_ERR ( "%s bit=%d\n", __func__, bit_id );
1562                 break;
1563         }
1564
1565         return -1;
1566 }
1567
1568 static struct bit_basher_operations falcon_i2c_bit_ops = {
1569         .read           = falcon_i2c_bit_read,
1570         .write          = falcon_i2c_bit_write,
1571 };
1572
1573
1574 /*******************************************************************************
1575  *
1576  *
1577  * MDIO access
1578  *
1579  *
1580  *******************************************************************************/ 
1581
1582 static int
1583 falcon_gmii_wait ( struct efab_nic *efab )
1584 {
1585         efab_dword_t md_stat;
1586         int count;
1587
1588         /* wait upto 10ms */
1589         for (count = 0; count < 1000; count++) {
1590                 falcon_readl ( efab, &md_stat, FCN_MD_STAT_REG_KER );
1591                 if ( EFAB_DWORD_FIELD ( md_stat, FCN_MD_BSY ) == 0 ) {
1592                         if ( EFAB_DWORD_FIELD ( md_stat, FCN_MD_LNFL ) != 0 ||
1593                              EFAB_DWORD_FIELD ( md_stat, FCN_MD_BSERR ) != 0 ) {
1594                                 EFAB_ERR ( "Error from GMII access "
1595                                            EFAB_DWORD_FMT"\n",
1596                                            EFAB_DWORD_VAL ( md_stat ));
1597                                 return -EIO;
1598                         }
1599                         return 0;
1600                 }
1601                 udelay(10);
1602         }
1603
1604         EFAB_ERR ( "Timed out waiting for GMII\n" );
1605         return -ETIMEDOUT;
1606 }
1607
1608 static void
1609 falcon_mdio_write ( struct efab_nic *efab, int device,
1610                     int location, int value )
1611 {
1612         efab_oword_t reg;
1613
1614         EFAB_TRACE ( "Writing GMII %d register %02x with %04x\n",
1615                      device, location, value );
1616
1617         /* Check MII not currently being accessed */
1618         if ( falcon_gmii_wait ( efab ) )
1619                 return;
1620
1621         /* Write the address/ID register */
1622         EFAB_POPULATE_OWORD_1 ( reg, FCN_MD_PHY_ADR, location );
1623         falcon_write ( efab, &reg, FCN_MD_PHY_ADR_REG_KER );
1624
1625         if ( efab->phy_10g ) {
1626                 /* clause45 */
1627                 EFAB_POPULATE_OWORD_2 ( reg, 
1628                                         FCN_MD_PRT_ADR, efab->phy_addr,
1629                                         FCN_MD_DEV_ADR, device );
1630         }
1631         else {
1632                 /* clause22 */
1633                 assert ( device == 0 );
1634
1635                 EFAB_POPULATE_OWORD_2 ( reg,
1636                                         FCN_MD_PRT_ADR, efab->phy_addr,
1637                                         FCN_MD_DEV_ADR, location );
1638         }
1639         falcon_write ( efab, &reg, FCN_MD_ID_REG_KER );
1640                 
1641
1642         /* Write data */
1643         EFAB_POPULATE_OWORD_1 ( reg, FCN_MD_TXD, value );
1644         falcon_write ( efab, &reg, FCN_MD_TXD_REG_KER );
1645
1646         EFAB_POPULATE_OWORD_2 ( reg,
1647                                 FCN_MD_WRC, 1,
1648                                 FCN_MD_GC, ( efab->phy_10g ? 0 : 1 ) );
1649         falcon_write ( efab, &reg, FCN_MD_CS_REG_KER );
1650                 
1651         /* Wait for data to be written */
1652         if ( falcon_gmii_wait ( efab ) ) {
1653                 /* Abort the write operation */
1654                 EFAB_POPULATE_OWORD_2 ( reg,
1655                                         FCN_MD_WRC, 0,
1656                                         FCN_MD_GC, 1);
1657                 falcon_write ( efab, &reg, FCN_MD_CS_REG_KER );
1658                 udelay(10);
1659         }
1660 }
1661
1662 static int
1663 falcon_mdio_read ( struct efab_nic *efab, int device, int location )
1664 {
1665         efab_oword_t reg;
1666         int value;
1667
1668         /* Check MII not currently being accessed */
1669         if ( falcon_gmii_wait ( efab ) ) 
1670                 return -1;
1671
1672         if ( efab->phy_10g ) {
1673                 /* clause45 */
1674                 EFAB_POPULATE_OWORD_1 ( reg, FCN_MD_PHY_ADR, location );
1675                 falcon_write ( efab, &reg, FCN_MD_PHY_ADR_REG_KER );
1676
1677                 EFAB_POPULATE_OWORD_2 ( reg,
1678                                         FCN_MD_PRT_ADR, efab->phy_addr,
1679                                         FCN_MD_DEV_ADR, device );
1680                 falcon_write ( efab, &reg, FCN_MD_ID_REG_KER);
1681
1682                 /* request data to be read */
1683                 EFAB_POPULATE_OWORD_2 ( reg,
1684                                         FCN_MD_RDC, 1,
1685                                         FCN_MD_GC, 0 );
1686         }
1687         else {
1688                 /* clause22 */
1689                 assert ( device == 0 );
1690
1691                 EFAB_POPULATE_OWORD_2 ( reg,
1692                                         FCN_MD_PRT_ADR, efab->phy_addr,
1693                                         FCN_MD_DEV_ADR, location );
1694                 falcon_write ( efab, &reg, FCN_MD_ID_REG_KER );
1695
1696                 /* Request data to be read */
1697                 EFAB_POPULATE_OWORD_2 ( reg,
1698                                         FCN_MD_RIC, 1,
1699                                         FCN_MD_GC, 1 );
1700         }
1701
1702         falcon_write ( efab, &reg, FCN_MD_CS_REG_KER );
1703                 
1704         /* Wait for data to become available */
1705         if ( falcon_gmii_wait ( efab ) ) {
1706                 /* Abort the read operation */
1707                 EFAB_POPULATE_OWORD_2 ( reg,
1708                                         FCN_MD_RIC, 0,
1709                                         FCN_MD_GC, 1 );
1710                 falcon_write ( efab, &reg, FCN_MD_CS_REG_KER );
1711                 udelay ( 10 );
1712                 value = -1;
1713         }
1714         else {
1715                 /* Read the data */
1716                 falcon_read ( efab, &reg, FCN_MD_RXD_REG_KER );
1717                 value = EFAB_OWORD_FIELD ( reg, FCN_MD_RXD );
1718         }
1719
1720         EFAB_TRACE ( "Read from GMII %d register %02x, got %04x\n",
1721                      device, location, value );
1722
1723         return value;
1724 }
1725
1726 /*******************************************************************************
1727  *
1728  *
1729  * MAC wrapper
1730  *
1731  *
1732  *******************************************************************************/
1733
1734 static void
1735 falcon_reconfigure_mac_wrapper ( struct efab_nic *efab )
1736 {
1737         efab_oword_t reg;
1738         int link_speed;
1739
1740         if ( efab->link_options & LPA_10000 ) {
1741                 link_speed = 0x3;
1742         } else if ( efab->link_options & LPA_1000 ) {
1743                 link_speed = 0x2;
1744         } else if ( efab->link_options & LPA_100 ) {
1745                 link_speed = 0x1;
1746         } else {
1747                 link_speed = 0x0;
1748         }
1749         EFAB_POPULATE_OWORD_5 ( reg,
1750                                 FCN_MAC_XOFF_VAL, 0xffff /* datasheet */,
1751                                 FCN_MAC_BCAD_ACPT, 1,
1752                                 FCN_MAC_UC_PROM, 0,
1753                                 FCN_MAC_LINK_STATUS, 1,
1754                                 FCN_MAC_SPEED, link_speed );
1755
1756         falcon_write ( efab, &reg, FCN_MAC0_CTRL_REG_KER );
1757 }
1758
1759 /*******************************************************************************
1760  *
1761  *
1762  * GMAC handling
1763  *
1764  *
1765  *******************************************************************************/
1766
1767 /* GMAC configuration register 1 */
1768 #define GM_CFG1_REG_MAC 0x00
1769 #define GM_SW_RST_LBN 31
1770 #define GM_SW_RST_WIDTH 1
1771 #define GM_RX_FC_EN_LBN 5
1772 #define GM_RX_FC_EN_WIDTH 1
1773 #define GM_TX_FC_EN_LBN 4
1774 #define GM_TX_FC_EN_WIDTH 1
1775 #define GM_RX_EN_LBN 2
1776 #define GM_RX_EN_WIDTH 1
1777 #define GM_TX_EN_LBN 0
1778 #define GM_TX_EN_WIDTH 1
1779
1780 /* GMAC configuration register 2 */
1781 #define GM_CFG2_REG_MAC 0x01
1782 #define GM_PAMBL_LEN_LBN 12
1783 #define GM_PAMBL_LEN_WIDTH 4
1784 #define GM_IF_MODE_LBN 8
1785 #define GM_IF_MODE_WIDTH 2
1786 #define GM_PAD_CRC_EN_LBN 2
1787 #define GM_PAD_CRC_EN_WIDTH 1
1788 #define GM_FD_LBN 0
1789 #define GM_FD_WIDTH 1
1790
1791 /* GMAC maximum frame length register */
1792 #define GM_MAX_FLEN_REG_MAC 0x04
1793 #define GM_MAX_FLEN_LBN 0
1794 #define GM_MAX_FLEN_WIDTH 16
1795
1796 /* GMAC MII management configuration register */
1797 #define GM_MII_MGMT_CFG_REG_MAC 0x08
1798 #define GM_MGMT_CLK_SEL_LBN 0
1799 #define GM_MGMT_CLK_SEL_WIDTH 3
1800
1801 /* GMAC MII management command register */
1802 #define GM_MII_MGMT_CMD_REG_MAC 0x09
1803 #define GM_MGMT_SCAN_CYC_LBN 1
1804 #define GM_MGMT_SCAN_CYC_WIDTH 1
1805 #define GM_MGMT_RD_CYC_LBN 0
1806 #define GM_MGMT_RD_CYC_WIDTH 1
1807
1808 /* GMAC MII management address register */
1809 #define GM_MII_MGMT_ADR_REG_MAC 0x0a
1810 #define GM_MGMT_PHY_ADDR_LBN 8
1811 #define GM_MGMT_PHY_ADDR_WIDTH 5
1812 #define GM_MGMT_REG_ADDR_LBN 0
1813 #define GM_MGMT_REG_ADDR_WIDTH 5
1814
1815 /* GMAC MII management control register */
1816 #define GM_MII_MGMT_CTL_REG_MAC 0x0b
1817 #define GM_MGMT_CTL_LBN 0
1818 #define GM_MGMT_CTL_WIDTH 16
1819
1820 /* GMAC MII management status register */
1821 #define GM_MII_MGMT_STAT_REG_MAC 0x0c
1822 #define GM_MGMT_STAT_LBN 0
1823 #define GM_MGMT_STAT_WIDTH 16
1824
1825 /* GMAC MII management indicators register */
1826 #define GM_MII_MGMT_IND_REG_MAC 0x0d
1827 #define GM_MGMT_BUSY_LBN 0
1828 #define GM_MGMT_BUSY_WIDTH 1
1829
1830 /* GMAC station address register 1 */
1831 #define GM_ADR1_REG_MAC 0x10
1832 #define GM_HWADDR_5_LBN 24
1833 #define GM_HWADDR_5_WIDTH 8
1834 #define GM_HWADDR_4_LBN 16
1835 #define GM_HWADDR_4_WIDTH 8
1836 #define GM_HWADDR_3_LBN 8
1837 #define GM_HWADDR_3_WIDTH 8
1838 #define GM_HWADDR_2_LBN 0
1839 #define GM_HWADDR_2_WIDTH 8
1840
1841 /* GMAC station address register 2 */
1842 #define GM_ADR2_REG_MAC 0x11
1843 #define GM_HWADDR_1_LBN 24
1844 #define GM_HWADDR_1_WIDTH 8
1845 #define GM_HWADDR_0_LBN 16
1846 #define GM_HWADDR_0_WIDTH 8
1847
1848 /* GMAC FIFO configuration register 0 */
1849 #define GMF_CFG0_REG_MAC 0x12
1850 #define GMF_FTFENREQ_LBN 12
1851 #define GMF_FTFENREQ_WIDTH 1
1852 #define GMF_STFENREQ_LBN 11
1853 #define GMF_STFENREQ_WIDTH 1
1854 #define GMF_FRFENREQ_LBN 10
1855 #define GMF_FRFENREQ_WIDTH 1
1856 #define GMF_SRFENREQ_LBN 9
1857 #define GMF_SRFENREQ_WIDTH 1
1858 #define GMF_WTMENREQ_LBN 8
1859 #define GMF_WTMENREQ_WIDTH 1
1860
1861 /* GMAC FIFO configuration register 1 */
1862 #define GMF_CFG1_REG_MAC 0x13
1863 #define GMF_CFGFRTH_LBN 16
1864 #define GMF_CFGFRTH_WIDTH 5
1865 #define GMF_CFGXOFFRTX_LBN 0
1866 #define GMF_CFGXOFFRTX_WIDTH 16
1867
1868 /* GMAC FIFO configuration register 2 */
1869 #define GMF_CFG2_REG_MAC 0x14
1870 #define GMF_CFGHWM_LBN 16
1871 #define GMF_CFGHWM_WIDTH 6
1872 #define GMF_CFGLWM_LBN 0
1873 #define GMF_CFGLWM_WIDTH 6
1874
1875 /* GMAC FIFO configuration register 3 */
1876 #define GMF_CFG3_REG_MAC 0x15
1877 #define GMF_CFGHWMFT_LBN 16
1878 #define GMF_CFGHWMFT_WIDTH 6
1879 #define GMF_CFGFTTH_LBN 0
1880 #define GMF_CFGFTTH_WIDTH 6
1881
1882 /* GMAC FIFO configuration register 4 */
1883 #define GMF_CFG4_REG_MAC 0x16
1884 #define GMF_HSTFLTRFRM_PAUSE_LBN 12
1885 #define GMF_HSTFLTRFRM_PAUSE_WIDTH 12
1886
1887 /* GMAC FIFO configuration register 5 */
1888 #define GMF_CFG5_REG_MAC 0x17
1889 #define GMF_CFGHDPLX_LBN 22
1890 #define GMF_CFGHDPLX_WIDTH 1
1891 #define GMF_CFGBYTMODE_LBN 19
1892 #define GMF_CFGBYTMODE_WIDTH 1
1893 #define GMF_HSTDRPLT64_LBN 18
1894 #define GMF_HSTDRPLT64_WIDTH 1
1895 #define GMF_HSTFLTRFRMDC_PAUSE_LBN 12
1896 #define GMF_HSTFLTRFRMDC_PAUSE_WIDTH 1
1897
1898 static void
1899 falcon_gmac_writel ( struct efab_nic *efab, efab_dword_t *value,
1900                      unsigned int mac_reg )
1901 {
1902         efab_oword_t temp;
1903
1904         EFAB_POPULATE_OWORD_1 ( temp, FCN_MAC_DATA,
1905                                 EFAB_DWORD_FIELD ( *value, FCN_MAC_DATA ) );
1906         falcon_write ( efab, &temp, FALCON_GMAC_REG ( efab, mac_reg ) );
1907 }
1908
1909 static void
1910 falcon_gmac_readl ( struct efab_nic *efab, efab_dword_t *value,
1911                     unsigned int mac_reg )
1912 {
1913         efab_oword_t temp;
1914
1915         falcon_read ( efab, &temp, FALCON_GMAC_REG ( efab, mac_reg ) );
1916         EFAB_POPULATE_DWORD_1 ( *value, FCN_MAC_DATA,
1917                                 EFAB_OWORD_FIELD ( temp, FCN_MAC_DATA ) );
1918 }
1919
1920 static void
1921 mentormac_reset ( struct efab_nic *efab )
1922 {
1923         efab_dword_t reg;
1924
1925         /* Take into reset */
1926         EFAB_POPULATE_DWORD_1 ( reg, GM_SW_RST, 1 );
1927         falcon_gmac_writel ( efab, &reg, GM_CFG1_REG_MAC );
1928         udelay ( 1000 );
1929
1930         /* Take out of reset */
1931         EFAB_POPULATE_DWORD_1 ( reg, GM_SW_RST, 0 );
1932         falcon_gmac_writel ( efab, &reg, GM_CFG1_REG_MAC );
1933         udelay ( 1000 );
1934
1935         /* Configure GMII interface so PHY is accessible.  Note that
1936          * GMII interface is connected only to port 0, and that on
1937          * Falcon this is a no-op.
1938          */
1939         EFAB_POPULATE_DWORD_1 ( reg, GM_MGMT_CLK_SEL, 0x4 );
1940         falcon_gmac_writel ( efab, &reg, GM_MII_MGMT_CFG_REG_MAC );
1941         udelay ( 10 );
1942 }
1943
1944 static void
1945 mentormac_init ( struct efab_nic *efab )
1946 {
1947         int pause, if_mode, full_duplex, bytemode, half_duplex;
1948         efab_dword_t reg;
1949
1950         /* Configuration register 1 */
1951         pause = ( efab->link_options & LPA_PAUSE ) ? 1 : 0;
1952         if ( ! ( efab->link_options & LPA_DUPLEX ) ) {
1953                 /* Half-duplex operation requires TX flow control */
1954                 pause = 1;
1955         }
1956         EFAB_POPULATE_DWORD_4 ( reg,
1957                                 GM_TX_EN, 1,
1958                                 GM_TX_FC_EN, pause,
1959                                 GM_RX_EN, 1,
1960                                 GM_RX_FC_EN, 1 );
1961         falcon_gmac_writel ( efab, &reg, GM_CFG1_REG_MAC );
1962         udelay ( 10 );
1963
1964         /* Configuration register 2 */
1965         if_mode = ( efab->link_options & LPA_1000 ) ? 2 : 1;
1966         full_duplex = ( efab->link_options & LPA_DUPLEX ) ? 1 : 0;
1967         EFAB_POPULATE_DWORD_4 ( reg,
1968                                 GM_IF_MODE, if_mode,
1969                                 GM_PAD_CRC_EN, 1,
1970                                 GM_FD, full_duplex,
1971                                 GM_PAMBL_LEN, 0x7 /* ? */ );
1972         falcon_gmac_writel ( efab, &reg, GM_CFG2_REG_MAC );
1973         udelay ( 10 );
1974
1975         /* Max frame len register */
1976         EFAB_POPULATE_DWORD_1 ( reg, GM_MAX_FLEN,
1977                                 EFAB_MAX_FRAME_LEN ( ETH_FRAME_LEN ) );
1978         falcon_gmac_writel ( efab, &reg, GM_MAX_FLEN_REG_MAC );
1979         udelay ( 10 );
1980
1981         /* FIFO configuration register 0 */
1982         EFAB_POPULATE_DWORD_5 ( reg,
1983                                 GMF_FTFENREQ, 1,
1984                                 GMF_STFENREQ, 1,
1985                                 GMF_FRFENREQ, 1,
1986                                 GMF_SRFENREQ, 1,
1987                                 GMF_WTMENREQ, 1 );
1988         falcon_gmac_writel ( efab, &reg, GMF_CFG0_REG_MAC );
1989         udelay ( 10 );
1990
1991         /* FIFO configuration register 1 */
1992         EFAB_POPULATE_DWORD_2 ( reg,
1993                                 GMF_CFGFRTH, 0x12,
1994                                 GMF_CFGXOFFRTX, 0xffff );
1995         falcon_gmac_writel ( efab, &reg, GMF_CFG1_REG_MAC );
1996         udelay ( 10 );
1997
1998         /* FIFO configuration register 2 */
1999         EFAB_POPULATE_DWORD_2 ( reg,
2000                                 GMF_CFGHWM, 0x3f,
2001                                 GMF_CFGLWM, 0xa );
2002         falcon_gmac_writel ( efab, &reg, GMF_CFG2_REG_MAC );
2003         udelay ( 10 );
2004
2005         /* FIFO configuration register 3 */
2006         EFAB_POPULATE_DWORD_2 ( reg,
2007                                 GMF_CFGHWMFT, 0x1c,
2008                                 GMF_CFGFTTH, 0x08 );
2009         falcon_gmac_writel ( efab, &reg, GMF_CFG3_REG_MAC );
2010         udelay ( 10 );
2011
2012         /* FIFO configuration register 4 */
2013         EFAB_POPULATE_DWORD_1 ( reg, GMF_HSTFLTRFRM_PAUSE, 1 );
2014         falcon_gmac_writel ( efab, &reg, GMF_CFG4_REG_MAC );
2015         udelay ( 10 );
2016         
2017         /* FIFO configuration register 5 */
2018         bytemode = ( efab->link_options & LPA_1000 ) ? 1 : 0;
2019         half_duplex = ( efab->link_options & LPA_DUPLEX ) ? 0 : 1;
2020         falcon_gmac_readl ( efab, &reg, GMF_CFG5_REG_MAC );
2021         EFAB_SET_DWORD_FIELD ( reg, GMF_CFGBYTMODE, bytemode );
2022         EFAB_SET_DWORD_FIELD ( reg, GMF_CFGHDPLX, half_duplex );
2023         EFAB_SET_DWORD_FIELD ( reg, GMF_HSTDRPLT64, half_duplex );
2024         EFAB_SET_DWORD_FIELD ( reg, GMF_HSTFLTRFRMDC_PAUSE, 0 );
2025         falcon_gmac_writel ( efab, &reg, GMF_CFG5_REG_MAC );
2026         udelay ( 10 );
2027         
2028         /* MAC address */
2029         EFAB_POPULATE_DWORD_4 ( reg,
2030                                 GM_HWADDR_5, efab->mac_addr[5],
2031                                 GM_HWADDR_4, efab->mac_addr[4],
2032                                 GM_HWADDR_3, efab->mac_addr[3],
2033                                 GM_HWADDR_2, efab->mac_addr[2] );
2034         falcon_gmac_writel ( efab, &reg, GM_ADR1_REG_MAC );
2035         udelay ( 10 );
2036         EFAB_POPULATE_DWORD_2 ( reg,
2037                                 GM_HWADDR_1, efab->mac_addr[1],
2038                                 GM_HWADDR_0, efab->mac_addr[0] );
2039         falcon_gmac_writel ( efab, &reg, GM_ADR2_REG_MAC );
2040         udelay ( 10 );
2041 }
2042
2043 static int
2044 falcon_init_gmac ( struct efab_nic *efab )
2045 {
2046         /* Reset the MAC */
2047         mentormac_reset ( efab );
2048
2049         /* Initialise PHY */
2050         efab->phy_op->init ( efab );
2051
2052         /* check the link is up */
2053         if ( !efab->link_up )
2054                 return -EAGAIN;
2055
2056         /* Initialise MAC */
2057         mentormac_init ( efab );
2058
2059         /* reconfigure the MAC wrapper */
2060         falcon_reconfigure_mac_wrapper ( efab );
2061
2062         return 0;
2063 }
2064
2065 static struct efab_mac_operations falcon_gmac_operations = {
2066         .init                   = falcon_init_gmac,
2067 };
2068
2069
2070 /*******************************************************************************
2071  *
2072  *
2073  * XMAC handling
2074  *
2075  *
2076  *******************************************************************************/
2077
2078 /**
2079  * Write dword to a Falcon XMAC register
2080  *
2081  */
2082 static void
2083 falcon_xmac_writel ( struct efab_nic *efab, efab_dword_t *value,
2084                      unsigned int mac_reg )
2085 {
2086         efab_oword_t temp;
2087
2088         EFAB_POPULATE_OWORD_1 ( temp, FCN_MAC_DATA,
2089                                 EFAB_DWORD_FIELD ( *value, FCN_MAC_DATA ) );
2090         falcon_write ( efab, &temp,
2091                        FALCON_XMAC_REG ( efab, mac_reg ) );
2092 }
2093
2094 /**
2095  * Read dword from a Falcon XMAC register
2096  *
2097  */
2098 static void
2099 falcon_xmac_readl ( struct efab_nic *efab, efab_dword_t *value,
2100                     unsigned int mac_reg )
2101 {
2102         efab_oword_t temp;
2103
2104         falcon_read ( efab, &temp,
2105                       FALCON_XMAC_REG ( efab, mac_reg ) );
2106         EFAB_POPULATE_DWORD_1 ( *value, FCN_MAC_DATA,
2107                                 EFAB_OWORD_FIELD ( temp, FCN_MAC_DATA ) );
2108 }
2109
2110 /**
2111  * Configure Falcon XAUI output
2112  */
2113 static void
2114 falcon_setup_xaui ( struct efab_nic *efab )
2115 {
2116         efab_dword_t sdctl, txdrv;
2117
2118         falcon_xmac_readl ( efab, &sdctl, FCN_XX_SD_CTL_REG_MAC );
2119         EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_HIDRVD, XX_SD_CTL_DRV_DEFAULT );
2120         EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_LODRVD, XX_SD_CTL_DRV_DEFAULT );
2121         EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_HIDRVC, XX_SD_CTL_DRV_DEFAULT );
2122         EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_LODRVC, XX_SD_CTL_DRV_DEFAULT );
2123         EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_HIDRVB, XX_SD_CTL_DRV_DEFAULT );
2124         EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_LODRVB, XX_SD_CTL_DRV_DEFAULT );
2125         EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_HIDRVA, XX_SD_CTL_DRV_DEFAULT );
2126         EFAB_SET_DWORD_FIELD ( sdctl, FCN_XX_LODRVA, XX_SD_CTL_DRV_DEFAULT );
2127         falcon_xmac_writel ( efab, &sdctl, FCN_XX_SD_CTL_REG_MAC );
2128
2129         EFAB_POPULATE_DWORD_8 ( txdrv,
2130                                 FCN_XX_DEQD, XX_TXDRV_DEQ_DEFAULT,
2131                                 FCN_XX_DEQC, XX_TXDRV_DEQ_DEFAULT,
2132                                 FCN_XX_DEQB, XX_TXDRV_DEQ_DEFAULT,
2133                                 FCN_XX_DEQA, XX_TXDRV_DEQ_DEFAULT,
2134                                 FCN_XX_DTXD, XX_TXDRV_DTX_DEFAULT,
2135                                 FCN_XX_DTXC, XX_TXDRV_DTX_DEFAULT,
2136                                 FCN_XX_DTXB, XX_TXDRV_DTX_DEFAULT,
2137                                 FCN_XX_DTXA, XX_TXDRV_DTX_DEFAULT);
2138         falcon_xmac_writel ( efab, &txdrv, FCN_XX_TXDRV_CTL_REG_MAC);
2139 }
2140
2141 static int
2142 falcon_xgmii_status ( struct efab_nic *efab )
2143 {
2144         efab_dword_t reg;
2145
2146         if ( efab->pci_revision  < FALCON_REV_B0 )
2147                 return 1;
2148         /* The ISR latches, so clear it and re-read */
2149         falcon_xmac_readl ( efab, &reg, FCN_XM_MGT_INT_REG_MAC_B0 );
2150         falcon_xmac_readl ( efab, &reg, FCN_XM_MGT_INT_REG_MAC_B0 );
2151
2152         if ( EFAB_DWORD_FIELD ( reg, FCN_XM_LCLFLT ) ||
2153              EFAB_DWORD_FIELD ( reg, FCN_XM_RMTFLT ) ) {
2154                 EFAB_TRACE ( "MGT_INT: "EFAB_DWORD_FMT"\n",
2155                              EFAB_DWORD_VAL ( reg ) );
2156                 return 0;
2157         }
2158
2159         return 1;
2160 }
2161
2162 static void
2163 falcon_mask_status_intr ( struct efab_nic *efab, int enable )
2164 {
2165         efab_dword_t reg;
2166
2167         if ( efab->pci_revision  < FALCON_REV_B0 )
2168                 return;
2169
2170         /* Flush the ISR */
2171         if ( enable )
2172                 falcon_xmac_readl ( efab, &reg, FCN_XM_MGT_INT_REG_MAC_B0 );
2173
2174         EFAB_POPULATE_DWORD_2 ( reg,
2175                                 FCN_XM_MSK_RMTFLT, !enable,
2176                                 FCN_XM_MSK_LCLFLT, !enable);
2177         falcon_xmac_readl ( efab, &reg, FCN_XM_MGT_INT_MSK_REG_MAC_B0 );
2178 }
2179
2180 /**
2181  * Reset 10G MAC connected to port
2182  *
2183  */
2184 static int
2185 falcon_reset_xmac ( struct efab_nic *efab )
2186 {
2187         efab_dword_t reg;
2188         int count;
2189
2190         EFAB_POPULATE_DWORD_1 ( reg, FCN_XM_CORE_RST, 1 );
2191         falcon_xmac_writel ( efab, &reg, FCN_XM_GLB_CFG_REG_MAC );
2192
2193         for ( count = 0 ; count < 1000 ; count++ ) {
2194                 udelay ( 10 );
2195                 falcon_xmac_readl ( efab, &reg,
2196                                     FCN_XM_GLB_CFG_REG_MAC );
2197                 if ( EFAB_DWORD_FIELD ( reg, FCN_XM_CORE_RST ) == 0 )
2198                         return 0;
2199         }
2200         return -ETIMEDOUT;
2201 }
2202
2203
2204 static int
2205 falcon_reset_xaui ( struct efab_nic *efab )
2206 {
2207         efab_dword_t reg;
2208         int count;
2209
2210         if (!efab->is_asic)
2211                 return 0;
2212
2213         EFAB_POPULATE_DWORD_1 ( reg, FCN_XX_RST_XX_EN, 1 );
2214         falcon_xmac_writel ( efab, &reg, FCN_XX_PWR_RST_REG_MAC );
2215
2216         /* Give some time for the link to establish */
2217         for (count = 0; count < 1000; count++) { /* wait upto 10ms */
2218                 falcon_xmac_readl ( efab, &reg, FCN_XX_PWR_RST_REG_MAC );
2219                 if ( EFAB_DWORD_FIELD ( reg, FCN_XX_RST_XX_EN ) == 0 ) {
2220                         falcon_setup_xaui ( efab );
2221                         return 0;
2222                 }
2223                 udelay(10);
2224         }
2225         EFAB_ERR ( "timed out waiting for XAUI/XGXS reset\n" );
2226         return -ETIMEDOUT;
2227 }
2228
2229 static int
2230 falcon_xaui_link_ok ( struct efab_nic *efab )
2231 {
2232         efab_dword_t reg;
2233         int align_done, lane_status, sync;
2234         int has_phyxs;
2235         int link_ok = 1;
2236
2237         /* Read Falcon XAUI side */
2238         if ( efab->is_asic ) {
2239                 /* Read link status */
2240                 falcon_xmac_readl ( efab, &reg, FCN_XX_CORE_STAT_REG_MAC );
2241                 align_done = EFAB_DWORD_FIELD ( reg, FCN_XX_ALIGN_DONE );
2242
2243                 sync = EFAB_DWORD_FIELD ( reg, FCN_XX_SYNC_STAT );
2244                 sync = ( sync == FCN_XX_SYNC_STAT_DECODE_SYNCED );
2245                 
2246                 link_ok = align_done && sync;
2247         }
2248
2249         /* Clear link status ready for next read */
2250         EFAB_SET_DWORD_FIELD ( reg, FCN_XX_COMMA_DET, FCN_XX_COMMA_DET_RESET );
2251         EFAB_SET_DWORD_FIELD ( reg, FCN_XX_CHARERR, FCN_XX_CHARERR_RESET);
2252         EFAB_SET_DWORD_FIELD ( reg, FCN_XX_DISPERR, FCN_XX_DISPERR_RESET);
2253         falcon_xmac_writel ( efab, &reg, FCN_XX_CORE_STAT_REG_MAC );
2254
2255         has_phyxs = ( efab->phy_op->mmds & ( 1 << MDIO_MMD_PHYXS ) );
2256         if ( link_ok && has_phyxs ) {
2257                 lane_status = falcon_mdio_read ( efab, MDIO_MMD_PHYXS,
2258                                                  MDIO_PHYXS_LANE_STATE );
2259                 link_ok = ( lane_status & ( 1 << MDIO_PHYXS_LANE_ALIGNED_LBN ) );
2260
2261                 if (!link_ok )
2262                         EFAB_LOG ( "XGXS lane status: %x\n", lane_status );
2263         }
2264
2265         return link_ok;
2266 }
2267
2268 /**
2269  * Initialise XMAC
2270  *
2271  */
2272 static void
2273 falcon_reconfigure_xmac ( struct efab_nic *efab )
2274 {
2275         efab_dword_t reg;
2276         int max_frame_len;
2277
2278         /* Configure MAC - cut-thru mode is hard wired on */
2279         EFAB_POPULATE_DWORD_3 ( reg,
2280                                 FCN_XM_RX_JUMBO_MODE, 1,
2281                                 FCN_XM_TX_STAT_EN, 1,
2282                                 FCN_XM_RX_STAT_EN, 1);
2283         falcon_xmac_writel ( efab, &reg, FCN_XM_GLB_CFG_REG_MAC );
2284
2285         /* Configure TX */
2286         EFAB_POPULATE_DWORD_6 ( reg, 
2287                                 FCN_XM_TXEN, 1,
2288                                 FCN_XM_TX_PRMBL, 1,
2289                                 FCN_XM_AUTO_PAD, 1,
2290                                 FCN_XM_TXCRC, 1,
2291                                 FCN_XM_FCNTL, 1,
2292                                 FCN_XM_IPG, 0x3 );
2293         falcon_xmac_writel ( efab, &reg, FCN_XM_TX_CFG_REG_MAC );
2294
2295         /* Configure RX */
2296         EFAB_POPULATE_DWORD_4 ( reg,
2297                                 FCN_XM_RXEN, 1,
2298                                 FCN_XM_AUTO_DEPAD, 0,
2299                                 FCN_XM_ACPT_ALL_MCAST, 1,
2300                                 FCN_XM_PASS_CRC_ERR, 1 );
2301         falcon_xmac_writel ( efab, &reg, FCN_XM_RX_CFG_REG_MAC );
2302
2303         /* Set frame length */
2304         max_frame_len = EFAB_MAX_FRAME_LEN ( ETH_FRAME_LEN );
2305         EFAB_POPULATE_DWORD_1 ( reg,
2306                                 FCN_XM_MAX_RX_FRM_SIZE, max_frame_len );
2307         falcon_xmac_writel ( efab, &reg, FCN_XM_RX_PARAM_REG_MAC );
2308         EFAB_POPULATE_DWORD_2 ( reg,
2309                                 FCN_XM_MAX_TX_FRM_SIZE, max_frame_len,
2310                                 FCN_XM_TX_JUMBO_MODE, 1 );
2311         falcon_xmac_writel ( efab, &reg, FCN_XM_TX_PARAM_REG_MAC );
2312
2313         /* Enable flow control receipt */
2314         EFAB_POPULATE_DWORD_2 ( reg,
2315                                 FCN_XM_PAUSE_TIME, 0xfffe,
2316                                 FCN_XM_DIS_FCNTL, 0 );
2317         falcon_xmac_writel ( efab, &reg, FCN_XM_FC_REG_MAC );
2318
2319         /* Set MAC address */
2320         EFAB_POPULATE_DWORD_4 ( reg,
2321                                 FCN_XM_ADR_0, efab->mac_addr[0],
2322                                 FCN_XM_ADR_1, efab->mac_addr[1],
2323                                 FCN_XM_ADR_2, efab->mac_addr[2],
2324                                 FCN_XM_ADR_3, efab->mac_addr[3] );
2325         falcon_xmac_writel ( efab, &reg, FCN_XM_ADR_LO_REG_MAC );
2326         EFAB_POPULATE_DWORD_2 ( reg,
2327                                 FCN_XM_ADR_4, efab->mac_addr[4],
2328                                 FCN_XM_ADR_5, efab->mac_addr[5] );
2329         falcon_xmac_writel ( efab, &reg, FCN_XM_ADR_HI_REG_MAC );
2330 }
2331
2332 static int
2333 falcon_init_xmac ( struct efab_nic *efab )
2334 {
2335         int count, rc;
2336
2337         /* Mask the PHY management interrupt */
2338         falcon_mask_status_intr ( efab, 0 );
2339
2340         /* Initialise the PHY to instantiate the clock. */
2341         rc = efab->phy_op->init ( efab );
2342         if ( rc ) {
2343                 EFAB_ERR ( "unable to initialise PHY\n" );
2344                 goto fail1;
2345         }
2346
2347         falcon_reset_xaui ( efab );
2348
2349         /* Give the PHY and MAC time to faff */
2350         mdelay ( 100 );
2351
2352         /* Reset and reconfigure the XMAC */
2353         rc = falcon_reset_xmac ( efab );
2354         if ( rc )
2355                 goto fail2;
2356         falcon_reconfigure_xmac ( efab );
2357         falcon_reconfigure_mac_wrapper ( efab );
2358         /**
2359          * Now wait for the link to come up. This may take a while
2360          * for some slower PHY's.
2361          */
2362         for (count=0; count<50; count++) {
2363                 int link_ok = 1;
2364
2365                 /* Wait a while for the link to come up. */
2366                 mdelay ( 100 );
2367                 if ((count % 5) == 0)
2368                         putchar ( '.' );
2369
2370                 /* Does the PHY think the wire-side link is up? */
2371                 link_ok = mdio_clause45_links_ok ( efab );
2372                 /* Ensure the XAUI link to the PHY is good */
2373                 if ( link_ok ) {
2374                         link_ok = falcon_xaui_link_ok ( efab );
2375                         if ( !link_ok )
2376                                 falcon_reset_xaui ( efab );
2377                 }
2378
2379                 /* Check fault indication */
2380                 if ( link_ok )
2381                         link_ok = falcon_xgmii_status ( efab );
2382
2383                 efab->link_up = link_ok;
2384                 if ( link_ok ) {
2385                         /* unmask the status interrupt */
2386                         falcon_mask_status_intr ( efab, 1 );
2387                         return 0;
2388                 }
2389         }
2390
2391         /* Link failed to come up, but initialisation was fine. */
2392         rc = -ETIMEDOUT;
2393
2394 fail2:
2395 fail1:
2396         return rc;
2397 }
2398
2399 static struct efab_mac_operations falcon_xmac_operations = {
2400         .init                   = falcon_init_xmac,
2401 };
2402
2403 /*******************************************************************************
2404  *
2405  *
2406  * Null PHY handling
2407  *
2408  *
2409  *******************************************************************************/
2410
2411 static int
2412 falcon_xaui_phy_init ( struct efab_nic *efab )
2413 {
2414         /* CX4 is always 10000FD only */
2415         efab->link_options = LPA_10000FULL;
2416
2417         /* There is no PHY! */
2418         return 0;
2419 }
2420
2421 static struct efab_phy_operations falcon_xaui_phy_ops = {
2422         .init                   = falcon_xaui_phy_init,
2423         .mmds                   = 0,
2424 };
2425
2426
2427 /*******************************************************************************
2428  *
2429  *
2430  * Alaska PHY
2431  *
2432  *
2433  *******************************************************************************/
2434
2435 /**
2436  * Initialise Alaska PHY
2437  *
2438  */
2439 static int
2440 alaska_init ( struct efab_nic *efab )
2441 {
2442         unsigned int advertised, lpa;
2443
2444         /* Read link up status */
2445         efab->link_up = gmii_link_ok ( efab );
2446
2447         if ( ! efab->link_up )
2448                 return -EIO;
2449
2450         /* Determine link options from PHY. */
2451         advertised = gmii_autoneg_advertised ( efab );
2452         lpa = gmii_autoneg_lpa ( efab );
2453         efab->link_options = gmii_nway_result ( advertised & lpa );
2454
2455         return 0;
2456 }
2457
2458 static struct efab_phy_operations falcon_alaska_phy_ops = {
2459         .init           = alaska_init,
2460 };
2461
2462 /*******************************************************************************
2463  *
2464  *
2465  * xfp
2466  *
2467  *
2468  *******************************************************************************/
2469
2470 #define XFP_REQUIRED_DEVS ( MDIO_MMDREG_DEVS0_PCS    |          \
2471                             MDIO_MMDREG_DEVS0_PMAPMD |          \
2472                             MDIO_MMDREG_DEVS0_PHYXS )
2473
2474 static int
2475 falcon_xfp_phy_init ( struct efab_nic *efab )
2476 {
2477         int rc;
2478
2479         /* Optical link is always 10000FD only */
2480         efab->link_options = LPA_10000FULL;
2481
2482         /* Reset the PHY */
2483         rc = mdio_clause45_reset_mmd ( efab, MDIO_MMD_PHYXS );
2484         if ( rc )
2485                 return rc;
2486
2487         return 0;
2488 }
2489
2490 static struct efab_phy_operations falcon_xfp_phy_ops = {
2491         .init                   = falcon_xfp_phy_init,
2492         .mmds                   = XFP_REQUIRED_DEVS,
2493 };
2494
2495 /*******************************************************************************
2496  *
2497  *
2498  * txc43128
2499  *
2500  *
2501  *******************************************************************************/
2502
2503 /* Command register */
2504 #define TXC_GLRGS_GLCMD         (0xc004)
2505 #define TXC_GLCMD_LMTSWRST_LBN  (14)
2506
2507 /* Amplitude on lanes 0+1, 2+3 */
2508 #define  TXC_ALRGS_ATXAMP0      (0xc041)
2509 #define  TXC_ALRGS_ATXAMP1      (0xc042)
2510 /* Bit position of value for lane 0+2, 1+3 */
2511 #define TXC_ATXAMP_LANE02_LBN   (3)
2512 #define TXC_ATXAMP_LANE13_LBN   (11)
2513
2514 #define TXC_ATXAMP_1280_mV      (0)
2515 #define TXC_ATXAMP_1200_mV      (8)
2516 #define TXC_ATXAMP_1120_mV      (12)
2517 #define TXC_ATXAMP_1060_mV      (14)
2518 #define TXC_ATXAMP_0820_mV      (25)
2519 #define TXC_ATXAMP_0720_mV      (26)
2520 #define TXC_ATXAMP_0580_mV      (27)
2521 #define TXC_ATXAMP_0440_mV      (28)
2522
2523 #define TXC_ATXAMP_0820_BOTH    ( (TXC_ATXAMP_0820_mV << TXC_ATXAMP_LANE02_LBN) | \
2524                                   (TXC_ATXAMP_0820_mV << TXC_ATXAMP_LANE13_LBN) )
2525
2526 #define TXC_ATXAMP_DEFAULT      (0x6060) /* From databook */
2527
2528 /* Preemphasis on lanes 0+1, 2+3 */
2529 #define  TXC_ALRGS_ATXPRE0      (0xc043)
2530 #define  TXC_ALRGS_ATXPRE1      (0xc044)
2531
2532 #define TXC_ATXPRE_NONE (0)
2533 #define TXC_ATXPRE_DEFAULT      (0x1010) /* From databook */
2534
2535 #define TXC_REQUIRED_DEVS ( MDIO_MMDREG_DEVS0_PCS    |         \
2536                             MDIO_MMDREG_DEVS0_PMAPMD |         \
2537                             MDIO_MMDREG_DEVS0_PHYXS )
2538
2539 static int
2540 falcon_txc_logic_reset ( struct efab_nic *efab )
2541 {
2542         int val;
2543         int tries = 50;
2544
2545         val = falcon_mdio_read ( efab, MDIO_MMD_PCS, TXC_GLRGS_GLCMD );
2546         val |= (1 << TXC_GLCMD_LMTSWRST_LBN);
2547         falcon_mdio_write ( efab, MDIO_MMD_PCS, TXC_GLRGS_GLCMD, val );
2548
2549         while ( tries--) {
2550                 val = falcon_mdio_read ( efab, MDIO_MMD_PCS, TXC_GLRGS_GLCMD );
2551                 if ( ~val & ( 1 << TXC_GLCMD_LMTSWRST_LBN ) )
2552                         return 0;
2553                 udelay(1);
2554         }
2555
2556         EFAB_ERR ( "logic reset failed\n" );
2557
2558         return -ETIMEDOUT;
2559 }
2560
2561 static int
2562 falcon_txc_phy_init ( struct efab_nic *efab )
2563 {
2564         int rc;
2565
2566         /* CX4 is always 10000FD only */
2567         efab->link_options = LPA_10000FULL;
2568
2569         /* reset the phy */
2570         rc = mdio_clause45_reset_mmd ( efab, MDIO_MMD_PMAPMD );
2571         if ( rc )
2572                 goto fail1;
2573
2574         rc = mdio_clause45_check_mmds ( efab );
2575         if ( rc )
2576                 goto fail2;
2577
2578         /* Turn amplitude down and preemphasis off on the host side
2579          * (PHY<->MAC) as this is believed less likely to upset falcon
2580          * and no adverse effects have been noted. It probably also 
2581          * saves a picowatt or two */
2582
2583         /* Turn off preemphasis */
2584         falcon_mdio_write ( efab, MDIO_MMD_PHYXS, TXC_ALRGS_ATXPRE0,
2585                             TXC_ATXPRE_NONE );
2586         falcon_mdio_write ( efab, MDIO_MMD_PHYXS, TXC_ALRGS_ATXPRE1,
2587                             TXC_ATXPRE_NONE );
2588
2589         /* Turn down the amplitude */
2590         falcon_mdio_write ( efab, MDIO_MMD_PHYXS, TXC_ALRGS_ATXAMP0,
2591                             TXC_ATXAMP_0820_BOTH );
2592         falcon_mdio_write ( efab, MDIO_MMD_PHYXS, TXC_ALRGS_ATXAMP1,
2593                             TXC_ATXAMP_0820_BOTH );
2594
2595         /* Set the line side amplitude and preemphasis to the databook
2596          * defaults as an erratum causes them to be 0 on at least some
2597          * PHY rev.s */
2598         falcon_mdio_write ( efab, MDIO_MMD_PMAPMD, TXC_ALRGS_ATXPRE0,
2599                             TXC_ATXPRE_DEFAULT );
2600         falcon_mdio_write ( efab, MDIO_MMD_PMAPMD, TXC_ALRGS_ATXPRE1,
2601                             TXC_ATXPRE_DEFAULT );
2602         falcon_mdio_write ( efab, MDIO_MMD_PMAPMD, TXC_ALRGS_ATXAMP0,
2603                             TXC_ATXAMP_DEFAULT );
2604         falcon_mdio_write ( efab, MDIO_MMD_PMAPMD, TXC_ALRGS_ATXAMP1,
2605                             TXC_ATXAMP_DEFAULT );
2606
2607         rc = falcon_txc_logic_reset ( efab );
2608         if ( rc )
2609                 goto fail3;
2610
2611         return 0;
2612
2613 fail3:
2614 fail2:
2615 fail1:
2616         return rc;
2617 }
2618
2619 static struct efab_phy_operations falcon_txc_phy_ops = {
2620         .init                   = falcon_txc_phy_init,
2621         .mmds                   = TXC_REQUIRED_DEVS,
2622 };
2623
2624 /*******************************************************************************
2625  *
2626  *
2627  * tenxpress
2628  *
2629  *
2630  *******************************************************************************/
2631
2632
2633 #define TENXPRESS_REQUIRED_DEVS ( MDIO_MMDREG_DEVS0_PMAPMD |    \
2634                                   MDIO_MMDREG_DEVS0_PCS    |    \
2635                                   MDIO_MMDREG_DEVS0_PHYXS )
2636
2637 #define PCS_TEST_SELECT_REG 0xd807      /* PRM 10.5.8 */
2638 #define CLK312_EN_LBN 3
2639 #define CLK312_EN_WIDTH 1
2640
2641 #define PCS_CLOCK_CTRL_REG 0xd801
2642 #define PLL312_RST_N_LBN 2
2643
2644 /* Special Software reset register */
2645 #define PMA_PMD_EXT_CTRL_REG 49152
2646 #define PMA_PMD_EXT_SSR_LBN 15
2647
2648 /* Boot status register */
2649 #define PCS_BOOT_STATUS_REG     0xd000
2650 #define PCS_BOOT_FATAL_ERR_LBN  0
2651 #define PCS_BOOT_PROGRESS_LBN   1
2652 #define PCS_BOOT_PROGRESS_WIDTH 2
2653 #define PCS_BOOT_COMPLETE_LBN   3
2654
2655 #define PCS_SOFT_RST2_REG 0xd806
2656 #define SERDES_RST_N_LBN 13
2657 #define XGXS_RST_N_LBN 12
2658
2659 static int
2660 falcon_tenxpress_check_c11 ( struct efab_nic *efab )
2661 {
2662         int count;
2663         uint32_t boot_stat;
2664
2665         /* Check that the C11 CPU has booted */
2666         for (count=0; count<10; count++) {
2667                 boot_stat = falcon_mdio_read ( efab, MDIO_MMD_PCS,
2668                                                PCS_BOOT_STATUS_REG );
2669                 if ( boot_stat & ( 1 << PCS_BOOT_COMPLETE_LBN ) )
2670                         return 0;
2671
2672                 udelay(10);
2673         }
2674
2675         EFAB_ERR ( "C11 failed to boot\n" );
2676         return -ETIMEDOUT;
2677 }
2678
2679 static int
2680 falcon_tenxpress_phy_init ( struct efab_nic *efab )
2681 {
2682         int rc, reg;
2683
2684         /* 10XPRESS is always 10000FD (at the moment) */
2685         efab->link_options = LPA_10000FULL;
2686
2687         /* Wait for the blocks to come out of reset */
2688         rc = mdio_clause45_wait_reset_mmds ( efab );
2689         if ( rc )
2690                 goto fail1;
2691
2692         rc = mdio_clause45_check_mmds ( efab );
2693         if ( rc )
2694                 goto fail2;
2695
2696         /* Turn on the clock  */
2697         reg = (1 << CLK312_EN_LBN);
2698         falcon_mdio_write ( efab, MDIO_MMD_PCS, PCS_TEST_SELECT_REG, reg);
2699
2700         /* Wait 200ms for the PHY to boot */
2701         mdelay(200);
2702
2703         rc = falcon_tenxpress_check_c11 ( efab );
2704         if ( rc )
2705                 goto fail3;
2706
2707         return 0;
2708
2709 fail3:
2710 fail2:
2711 fail1:
2712         return rc;
2713 }
2714
2715 static struct efab_phy_operations falcon_tenxpress_phy_ops = {
2716         .init                   = falcon_tenxpress_phy_init,
2717         .mmds                   = TENXPRESS_REQUIRED_DEVS,
2718 };
2719
2720 /*******************************************************************************
2721  *
2722  *
2723  * PM8358
2724  *
2725  *
2726  *******************************************************************************/
2727
2728 /* The PM8358 just presents a DTE XS */
2729 #define PM8358_REQUIRED_DEVS (MDIO_MMDREG_DEVS0_DTEXS)
2730
2731 /* PHY-specific definitions */
2732 /* Master ID and Global Performance Monitor Update */
2733 #define PMC_MASTER_REG (0xd000)
2734 /* Analog Tx Rx settings under software control */
2735 #define PMC_MASTER_ANLG_CTRL (1<< 11)
2736
2737 /* Master Configuration register 2 */
2738 #define PMC_MCONF2_REG  (0xd002)
2739 /* Drive Tx off centre of data eye (1) vs. clock edge (0) */
2740 #define PMC_MCONF2_TEDGE (1 << 2) 
2741 /* Drive Rx off centre of data eye (1) vs. clock edge (0) */
2742 #define PMC_MCONF2_REDGE (1 << 3)
2743
2744 /* Analog Rx settings */
2745 #define PMC_ANALOG_RX_CFG0   (0xd025)
2746 #define PMC_ANALOG_RX_CFG1   (0xd02d)
2747 #define PMC_ANALOG_RX_CFG2   (0xd035)
2748 #define PMC_ANALOG_RX_CFG3   (0xd03d)
2749
2750
2751 #define PMC_ANALOG_RX_TERM     (1 << 15) /* Bit 15 of RX CFG: 0 for 100 ohms float,
2752                                             1 for 50 to 1.2V */
2753 #define PMC_ANALOG_RX_EQ_MASK (3 << 8)
2754 #define PMC_ANALOG_RX_EQ_NONE (0 << 8)
2755 #define PMC_ANALOG_RX_EQ_HALF (1 << 8)
2756 #define PMC_ANALOG_RX_EQ_FULL (2 << 8)
2757 #define PMC_ANALOG_RX_EQ_RSVD (3 << 8)
2758
2759 static int
2760 falcon_pm8358_phy_init ( struct efab_nic *efab )
2761 {
2762         int rc, reg, i;
2763
2764         /* This is a XAUI retimer part */
2765         efab->link_options = LPA_10000FULL;
2766
2767         rc = mdio_clause45_reset_mmd ( efab, MDIO_MMDREG_DEVS0_DTEXS );
2768         if ( rc )
2769                 return rc;
2770         
2771         /* Enable software control of analogue settings */
2772         reg = falcon_mdio_read ( efab, MDIO_MMD_DTEXS,  PMC_MASTER_REG );
2773         reg |= PMC_MASTER_ANLG_CTRL;
2774         falcon_mdio_write ( efab, MDIO_MMD_DTEXS, PMC_MASTER_REG, reg );
2775
2776         /* Turn rx eq on for all channels */
2777         for (i=0; i< 3; i++) {
2778                 /* The analog CFG registers are evenly spaced 8 apart */
2779                 uint16_t addr = PMC_ANALOG_RX_CFG0 + 8*i;
2780                 reg = falcon_mdio_read ( efab, MDIO_MMD_DTEXS, addr );
2781                 reg = ( reg & ~PMC_ANALOG_RX_EQ_MASK ) | PMC_ANALOG_RX_EQ_FULL;
2782                 falcon_mdio_write ( efab, MDIO_MMD_DTEXS, addr, reg );
2783         }
2784
2785         /* Set TEDGE, clear REDGE */
2786         reg = falcon_mdio_read ( efab, MDIO_MMD_DTEXS, PMC_MCONF2_REG );
2787         reg = ( reg & ~PMC_MCONF2_REDGE) | PMC_MCONF2_TEDGE;
2788         falcon_mdio_write ( efab, MDIO_MMD_DTEXS, PMC_MCONF2_REG, reg );
2789
2790         return 0;
2791 }
2792
2793 static struct efab_phy_operations falcon_pm8358_phy_ops = {
2794         .init                   = falcon_pm8358_phy_init,
2795         .mmds                   = PM8358_REQUIRED_DEVS,
2796 };
2797
2798 /*******************************************************************************
2799  *
2800  *
2801  * SFE4001 support
2802  *
2803  *
2804  *******************************************************************************/
2805
2806 #define MAX_TEMP_THRESH 90
2807
2808 /* I2C Expander */
2809 #define PCA9539 0x74
2810
2811 #define P0_IN 0x00
2812 #define P0_OUT 0x02
2813 #define P0_CONFIG 0x06
2814
2815 #define P0_EN_1V0X_LBN 0
2816 #define P0_EN_1V0X_WIDTH 1
2817 #define P0_EN_1V2_LBN 1
2818 #define P0_EN_1V2_WIDTH 1
2819 #define P0_EN_2V5_LBN 2
2820 #define P0_EN_2V5_WIDTH 1
2821 #define P0_EN_3V3X_LBN 3
2822 #define P0_EN_3V3X_WIDTH 1
2823 #define P0_EN_5V_LBN 4
2824 #define P0_EN_5V_WIDTH 1
2825 #define P0_X_TRST_LBN 6
2826 #define P0_X_TRST_WIDTH 1
2827
2828 #define P1_IN 0x01
2829 #define P1_CONFIG 0x07
2830
2831 #define P1_AFE_PWD_LBN 0
2832 #define P1_AFE_PWD_WIDTH 1
2833 #define P1_DSP_PWD25_LBN 1
2834 #define P1_DSP_PWD25_WIDTH 1
2835 #define P1_SPARE_LBN 4
2836 #define P1_SPARE_WIDTH 4
2837
2838 /* Temperature Sensor */
2839 #define MAX6647 0x4e
2840
2841 #define RSL     0x02
2842 #define RLHN    0x05
2843 #define WLHO    0x0b
2844
2845 static struct i2c_device i2c_pca9539 = {
2846         .dev_addr = PCA9539,
2847         .dev_addr_len = 1,
2848         .word_addr_len = 1,
2849 };
2850
2851
2852 static struct i2c_device i2c_max6647 = {
2853         .dev_addr = MAX6647,
2854         .dev_addr_len = 1,
2855         .word_addr_len = 1,
2856 };
2857
2858 static int
2859 sfe4001_init ( struct efab_nic *efab )
2860 {
2861         struct i2c_interface *i2c = &efab->i2c_bb.i2c;
2862         efab_dword_t reg;
2863         uint8_t in, cfg, out;
2864         int count, rc;
2865
2866         EFAB_LOG ( "Initialise SFE4001 board\n" );
2867
2868         /* Ensure XGXS and XAUI SerDes are held in reset */
2869         EFAB_POPULATE_DWORD_7 ( reg,
2870                                 FCN_XX_PWRDNA_EN, 1,
2871                                 FCN_XX_PWRDNB_EN, 1,
2872                                 FCN_XX_RSTPLLAB_EN, 1,
2873                                 FCN_XX_RESETA_EN, 1,
2874                                 FCN_XX_RESETB_EN, 1,
2875                                 FCN_XX_RSTXGXSRX_EN, 1,
2876                                 FCN_XX_RSTXGXSTX_EN, 1 );
2877         falcon_xmac_writel ( efab, &reg, FCN_XX_PWR_RST_REG_MAC);
2878         udelay(10);
2879
2880         /* Set DSP over-temperature alert threshold */
2881         cfg = MAX_TEMP_THRESH;
2882         rc = i2c->write ( i2c, &i2c_max6647, WLHO, &cfg, EFAB_BYTE );
2883         if ( rc )
2884                 goto fail1;
2885
2886         /* Read it back and verify */
2887         rc = i2c->read ( i2c, &i2c_max6647, RLHN, &in, EFAB_BYTE );
2888         if ( rc )
2889                 goto fail2;
2890
2891         if ( in != MAX_TEMP_THRESH ) {
2892                 EFAB_ERR ( "Unable to verify MAX6647 limit (requested=%d "
2893                            "confirmed=%d)\n", cfg, in );
2894                 rc = -EIO;
2895                 goto fail3;
2896         }
2897
2898         /* Clear any previous over-temperature alert */
2899         rc = i2c->read ( i2c, &i2c_max6647, RSL, &in, EFAB_BYTE );
2900         if ( rc )
2901                 goto fail4;
2902
2903         /* Enable port 0 and 1 outputs on IO expander */
2904         cfg = 0x00;
2905         rc = i2c->write ( i2c, &i2c_pca9539, P0_CONFIG, &cfg, EFAB_BYTE );
2906         if ( rc )
2907                 goto fail5;
2908         cfg = 0xff & ~(1 << P1_SPARE_LBN);
2909         rc = i2c->write ( i2c, &i2c_pca9539, P1_CONFIG, &cfg, EFAB_BYTE );
2910         if ( rc )
2911                 goto fail6;
2912
2913         /* Turn all power off then wait 1 sec. This ensures PHY is reset */
2914         out = 0xff & ~((0 << P0_EN_1V2_LBN) | (0 << P0_EN_2V5_LBN) |
2915                        (0 << P0_EN_3V3X_LBN) | (0 << P0_EN_5V_LBN) |
2916                        (0 << P0_EN_1V0X_LBN));
2917
2918         rc = i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE );
2919         if ( rc )
2920                 goto fail7;
2921
2922         mdelay(1000);
2923
2924         for (count=0; count<20; count++) {
2925                 /* Turn on 1.2V, 2.5V, 3.3V and 5V power rails */
2926                 out = 0xff & ~( (1 << P0_EN_1V2_LBN)  | (1 << P0_EN_2V5_LBN) |
2927                                 (1 << P0_EN_3V3X_LBN) | (1 << P0_EN_5V_LBN)  | 
2928                                 (1 << P0_X_TRST_LBN) );
2929
2930                 rc = i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE );
2931                 if ( rc )
2932                         goto fail8;
2933
2934                 mdelay ( 10 );
2935                 
2936                 /* Turn on the 1V power rail */
2937                 out  &= ~( 1 << P0_EN_1V0X_LBN );
2938                 rc = i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE );
2939                 if ( rc )
2940                         goto fail9;
2941
2942                 EFAB_LOG ( "Waiting for power...(attempt %d)\n", count);
2943                 mdelay ( 1000 );
2944
2945                 /* Check DSP is powered */
2946                 rc = i2c->read ( i2c, &i2c_pca9539, P1_IN, &in, EFAB_BYTE );
2947                 if ( rc )
2948                         goto fail10;
2949
2950                 if ( in & ( 1 << P1_AFE_PWD_LBN ) )
2951                         return 0;
2952         }
2953
2954         rc = -ETIMEDOUT;
2955
2956 fail10:
2957 fail9:
2958 fail8:
2959 fail7:
2960         /* Turn off power rails */
2961         out = 0xff;
2962         (void) i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE );
2963         /* Disable port 1 outputs on IO expander */
2964         out = 0xff;
2965         (void) i2c->write ( i2c, &i2c_pca9539, P1_CONFIG, &out, EFAB_BYTE );
2966 fail6:
2967         /* Disable port 0 outputs */
2968         out = 0xff;
2969         (void) i2c->write ( i2c, &i2c_pca9539, P1_CONFIG, &out, EFAB_BYTE );
2970 fail5:
2971 fail4:
2972 fail3:
2973 fail2:
2974 fail1:
2975         EFAB_ERR ( "Failed initialising SFE4001 board\n" );
2976         return rc;
2977 }
2978
2979 static void
2980 sfe4001_fini ( struct efab_nic *efab )
2981 {
2982         struct i2c_interface *i2c = &efab->i2c_bb.i2c;
2983         uint8_t in, cfg, out;
2984
2985         EFAB_ERR ( "Turning off SFE4001\n" );
2986
2987         /* Turn off all power rails */
2988         out = 0xff;
2989         (void) i2c->write ( i2c, &i2c_pca9539, P0_OUT, &out, EFAB_BYTE );
2990
2991         /* Disable port 1 outputs on IO expander */
2992         cfg = 0xff;
2993         (void) i2c->write ( i2c, &i2c_pca9539, P1_CONFIG, &cfg, EFAB_BYTE );
2994
2995         /* Disable port 0 outputs on IO expander */
2996         cfg = 0xff;
2997         (void) i2c->write ( i2c, &i2c_pca9539, P0_CONFIG, &cfg, EFAB_BYTE );
2998
2999         /* Clear any over-temperature alert */
3000         (void) i2c->read ( i2c, &i2c_max6647, RSL, &in, EFAB_BYTE );
3001 }
3002
3003 struct efab_board_operations sfe4001_ops = {
3004         .init           = sfe4001_init,
3005         .fini           = sfe4001_fini,
3006 };
3007
3008 static int sfe4002_init ( struct efab_nic *efab __attribute__((unused)) )
3009 {
3010         return 0;
3011 }
3012 static void sfe4002_fini ( struct efab_nic *efab __attribute__((unused)) )
3013 {
3014 }
3015
3016 struct efab_board_operations sfe4002_ops = {
3017         .init           = sfe4002_init,
3018         .fini           = sfe4002_fini,
3019 };
3020
3021 static int sfe4003_init ( struct efab_nic *efab __attribute__((unused)) )
3022 {
3023         return 0;
3024 }
3025 static void sfe4003_fini ( struct efab_nic *efab __attribute__((unused)) )
3026 {
3027 }
3028
3029 struct efab_board_operations sfe4003_ops = {
3030         .init           = sfe4003_init,
3031         .fini           = sfe4003_fini,
3032 };
3033
3034 /*******************************************************************************
3035  *
3036  *
3037  * Hardware initialisation
3038  *
3039  *
3040  *******************************************************************************/ 
3041
3042 static void
3043 falcon_free_special_buffer ( void *p )
3044 {
3045         /* We don't bother cleaning up the buffer table entries -
3046          * we're hardly limited */
3047         free_dma ( p, EFAB_BUF_ALIGN );
3048 }
3049
3050 static void*
3051 falcon_alloc_special_buffer ( struct efab_nic *efab, int bytes,
3052                               struct efab_special_buffer *entry )
3053 {
3054         void* buffer;
3055         int remaining;
3056         efab_qword_t buf_desc;
3057         unsigned long dma_addr;
3058
3059         /* Allocate the buffer, aligned on a buffer address boundary */
3060         buffer = malloc_dma ( bytes, EFAB_BUF_ALIGN );
3061         if ( ! buffer )
3062                 return NULL;
3063
3064         /* Push buffer table entries to back the buffer */
3065         entry->id = efab->buffer_head;
3066         entry->dma_addr = dma_addr = virt_to_bus ( buffer );
3067         assert ( ( dma_addr & ( EFAB_BUF_ALIGN - 1 ) ) == 0 );
3068
3069         remaining = bytes;
3070         while ( remaining > 0 ) {
3071                 EFAB_POPULATE_QWORD_3 ( buf_desc,
3072                                         FCN_IP_DAT_BUF_SIZE, FCN_IP_DAT_BUF_SIZE_4K,
3073                                         FCN_BUF_ADR_FBUF, ( dma_addr >> 12 ),
3074                                         FCN_BUF_OWNER_ID_FBUF, 0 );
3075
3076                 falcon_write_sram ( efab, &buf_desc, efab->buffer_head );
3077
3078                 ++efab->buffer_head;
3079                 dma_addr += EFAB_BUF_ALIGN;
3080                 remaining -= EFAB_BUF_ALIGN;
3081         }
3082
3083         EFAB_TRACE ( "Allocated 0x%x bytes at %p backed by buffer table "
3084                      "entries 0x%x..0x%x\n", bytes, buffer, entry->id,
3085                      efab->buffer_head - 1 );
3086
3087         return buffer;
3088 }
3089
3090 static void
3091 clear_b0_fpga_memories ( struct efab_nic *efab)
3092 {
3093         efab_oword_t blanko, temp;
3094         efab_dword_t blankd;
3095         int offset; 
3096
3097         EFAB_ZERO_OWORD ( blanko );
3098         EFAB_ZERO_DWORD ( blankd );
3099
3100         /* Clear the address region register */
3101         EFAB_POPULATE_OWORD_4 ( temp,
3102                                 FCN_ADR_REGION0, 0,
3103                                 FCN_ADR_REGION1, ( 1 << 16 ),
3104                                 FCN_ADR_REGION2, ( 2 << 16 ),
3105                                 FCN_ADR_REGION3, ( 3 << 16 ) );
3106         falcon_write ( efab, &temp, FCN_ADR_REGION_REG_KER );
3107         
3108         EFAB_TRACE ( "Clearing filter and RSS tables\n" );
3109
3110         for ( offset = FCN_RX_FILTER_TBL0 ;
3111               offset < FCN_RX_RSS_INDIR_TBL_B0+0x800 ;
3112               offset += 0x10 ) {
3113                 falcon_write ( efab, &blanko, offset );
3114         }
3115
3116         EFAB_TRACE ( "Wiping buffer tables\n" );
3117
3118         /* Notice the 8 byte access mode */
3119         for ( offset = 0x2800000 ;
3120               offset < 0x3000000 ;
3121               offset += 0x8) {
3122                 _falcon_writel ( efab, 0, offset );
3123                 _falcon_writel ( efab, 0, offset + 4 );
3124                 wmb();
3125         }
3126 }
3127
3128 static int
3129 falcon_reset ( struct efab_nic *efab )
3130 {
3131         efab_oword_t glb_ctl_reg_ker;
3132
3133         /* Initiate software reset */
3134         EFAB_POPULATE_OWORD_6 ( glb_ctl_reg_ker,
3135                                 FCN_PCIE_CORE_RST_CTL, EXCLUDE_FROM_RESET,
3136                                 FCN_PCIE_NSTCK_RST_CTL, EXCLUDE_FROM_RESET,
3137                                 FCN_PCIE_SD_RST_CTL, EXCLUDE_FROM_RESET,
3138                                 FCN_EE_RST_CTL, EXCLUDE_FROM_RESET,
3139                                 FCN_EXT_PHY_RST_DUR, 0x7, /* 10ms */
3140                                 FCN_SWRST, 1 );
3141
3142         falcon_write ( efab, &glb_ctl_reg_ker, FCN_GLB_CTL_REG_KER );
3143
3144         /* Allow 50ms for reset */
3145         mdelay ( 50 );
3146
3147         /* Check for device reset complete */
3148         falcon_read ( efab, &glb_ctl_reg_ker, FCN_GLB_CTL_REG_KER );
3149         if ( EFAB_OWORD_FIELD ( glb_ctl_reg_ker, FCN_SWRST ) != 0 ) {
3150                 EFAB_ERR ( "Reset failed\n" );
3151                 return -ETIMEDOUT;
3152         }
3153
3154         if ( ( efab->pci_revision == FALCON_REV_B0 ) && !efab->is_asic ) {
3155                 clear_b0_fpga_memories ( efab );
3156         }
3157
3158         return 0;
3159 }
3160
3161 /** Offset of MAC address within EEPROM or Flash */
3162 #define FALCON_MAC_ADDRESS_OFFSET 0x310
3163
3164 /*
3165  * Falcon EEPROM structure
3166  */
3167 #define SF_NV_CONFIG_BASE 0x300
3168 #define SF_NV_CONFIG_EXTRA 0xA0
3169
3170 struct falcon_nv_config_ver2 {
3171         uint16_t nports;
3172         uint8_t  port0_phy_addr;
3173         uint8_t  port0_phy_type;
3174         uint8_t  port1_phy_addr;
3175         uint8_t  port1_phy_type;
3176         uint16_t asic_sub_revision;
3177         uint16_t board_revision;
3178         uint8_t mac_location;
3179 };
3180
3181 struct falcon_nv_extra {
3182         uint16_t magicnumber;
3183         uint16_t structure_version;
3184         uint16_t checksum;
3185         union {
3186                 struct falcon_nv_config_ver2 ver2;
3187         } ver_specific;
3188 };
3189
3190 #define BOARD_TYPE(_rev) (_rev >> 8)
3191
3192 static void
3193 falcon_probe_nic_variant ( struct efab_nic *efab, struct pci_device *pci )
3194 {
3195         efab_oword_t altera_build, nic_stat;
3196         int is_pcie, fpga_version;
3197         uint8_t revision;
3198
3199         /* PCI revision */
3200         pci_read_config_byte ( pci, PCI_CLASS_REVISION, &revision );
3201         efab->pci_revision = revision;
3202
3203         /* Asic vs FPGA */
3204         falcon_read ( efab, &altera_build, FCN_ALTERA_BUILD_REG_KER );
3205         fpga_version = EFAB_OWORD_FIELD ( altera_build, FCN_VER_ALL );
3206         efab->is_asic = (fpga_version == 0);
3207
3208         /* MAC and PCI type */
3209         falcon_read ( efab, &nic_stat, FCN_NIC_STAT_REG );
3210         if ( efab->pci_revision == FALCON_REV_B0 ) {
3211                 is_pcie = 1;
3212                 efab->phy_10g = EFAB_OWORD_FIELD ( nic_stat, FCN_STRAP_10G );
3213         }
3214         else if ( efab->is_asic ) {
3215                 is_pcie = EFAB_OWORD_FIELD ( nic_stat, FCN_STRAP_PCIE );
3216                 efab->phy_10g = EFAB_OWORD_FIELD ( nic_stat, FCN_STRAP_10G );
3217         }
3218         else {
3219                 int minor = EFAB_OWORD_FIELD ( altera_build,  FCN_VER_MINOR );
3220                 is_pcie = 0;
3221                 efab->phy_10g = ( minor == 0x14 );
3222         }
3223 }
3224
3225 static void
3226 falcon_init_spi_device ( struct efab_nic *efab, struct spi_device *spi )
3227 {
3228         /* Falcon's SPI interface only supports reads/writes of up to 16 bytes.
3229          * Reduce the nvs block size down to satisfy this - which means callers
3230          * should use the nvs_* functions rather than spi_*. */
3231         if ( spi->nvs.block_size > FALCON_SPI_MAX_LEN )
3232                 spi->nvs.block_size = FALCON_SPI_MAX_LEN;
3233
3234         spi->bus = &efab->spi_bus;
3235         efab->spi = spi;
3236 }
3237
3238 static int
3239 falcon_probe_spi ( struct efab_nic *efab )
3240 {
3241         efab_oword_t nic_stat, gpio_ctl, ee_vpd_cfg;
3242         int has_flash, has_eeprom, ad9bit;
3243
3244         falcon_read ( efab, &nic_stat, FCN_NIC_STAT_REG );
3245         falcon_read ( efab, &gpio_ctl, FCN_GPIO_CTL_REG_KER );
3246         falcon_read ( efab, &ee_vpd_cfg, FCN_EE_VPD_CFG_REG );
3247
3248         /* determine if FLASH / EEPROM is present */
3249         if ( ( efab->pci_revision >= FALCON_REV_B0 ) || efab->is_asic ) {
3250                 has_flash = EFAB_OWORD_FIELD ( nic_stat, FCN_SF_PRST );
3251                 has_eeprom = EFAB_OWORD_FIELD ( nic_stat, FCN_EE_PRST );
3252         } else {
3253                 has_flash = EFAB_OWORD_FIELD ( gpio_ctl, FCN_FLASH_PRESENT );
3254                 has_eeprom = EFAB_OWORD_FIELD ( gpio_ctl, FCN_EEPROM_PRESENT );
3255         }
3256         ad9bit = EFAB_OWORD_FIELD ( ee_vpd_cfg, FCN_EE_VPD_EN_AD9_MODE );
3257
3258         /* Configure the SPI and I2C bus */
3259         efab->spi_bus.rw = falcon_spi_rw;
3260         init_i2c_bit_basher ( &efab->i2c_bb, &falcon_i2c_bit_ops );
3261
3262         /* Configure the EEPROM SPI device. Generally, an Atmel 25040
3263          * (or similar) is used, but this is only possible if there is also
3264          * a flash device present to store the boot-time chip configuration.
3265          */
3266         if ( has_eeprom ) {
3267                 if ( has_flash && ad9bit )
3268                         init_at25040 ( &efab->spi_eeprom );
3269                 else
3270                         init_mc25xx640 ( &efab->spi_eeprom );
3271                 falcon_init_spi_device ( efab, &efab->spi_eeprom );
3272         }
3273
3274         /* Configure the FLASH SPI device */
3275         if ( has_flash ) {
3276                 init_at25f1024 ( &efab->spi_flash );
3277                 falcon_init_spi_device ( efab, &efab->spi_flash );
3278         }
3279
3280         EFAB_LOG ( "flash is %s, EEPROM is %s%s\n",
3281                    ( has_flash ? "present" : "absent" ),
3282                    ( has_eeprom ? "present " : "absent" ),
3283                    ( has_eeprom ? (ad9bit ? "(9bit)" : "(16bit)") : "") );
3284
3285         /* The device MUST have flash or eeprom */
3286         if ( ! efab->spi ) {
3287                 EFAB_ERR ( "Device appears to have no flash or eeprom\n" );
3288                 return -EIO;
3289         }
3290
3291         /* If the device has EEPROM attached, then advertise NVO space */
3292         if ( has_eeprom )
3293                 nvo_init ( &efab->nvo, &efab->spi_eeprom.nvs, falcon_nvo_fragments,
3294                            &efab->netdev->refcnt );
3295
3296         return 0;
3297 }
3298
3299 static int
3300 falcon_probe_nvram ( struct efab_nic *efab )
3301 {
3302         struct nvs_device *nvs = &efab->spi->nvs;
3303         struct falcon_nv_extra nv;
3304         int rc, board_revision;
3305
3306         /* Read the MAC address */
3307         rc = nvs_read ( nvs, FALCON_MAC_ADDRESS_OFFSET,
3308                         efab->mac_addr, ETH_ALEN );
3309         if ( rc )
3310                 return rc;
3311
3312         /* Poke through the NVRAM structure for the PHY type. */
3313         rc = nvs_read ( nvs, SF_NV_CONFIG_BASE + SF_NV_CONFIG_EXTRA,
3314                         &nv, sizeof ( nv ) );
3315         if ( rc )
3316                 return rc;
3317
3318         /* Handle each supported NVRAM version */
3319         if ( ( le16_to_cpu ( nv.magicnumber ) == FCN_NV_MAGIC_NUMBER ) &&
3320              ( le16_to_cpu ( nv.structure_version ) >= 2 ) ) {
3321                 struct falcon_nv_config_ver2* ver2 = &nv.ver_specific.ver2;
3322                 
3323                 /* Get the PHY type */
3324                 efab->phy_addr = le16_to_cpu ( ver2->port0_phy_addr );
3325                 efab->phy_type = le16_to_cpu ( ver2->port0_phy_type );
3326                 board_revision = le16_to_cpu ( ver2->board_revision );
3327         }
3328         else {
3329                 EFAB_ERR ( "NVram is not recognised\n" );
3330                 return -EINVAL;
3331         }
3332
3333         efab->board_type = BOARD_TYPE ( board_revision );
3334         
3335         EFAB_TRACE ( "Falcon board %d phy %d @ addr %d\n",
3336                      efab->board_type, efab->phy_type, efab->phy_addr );
3337
3338         /* Patch in the board operations */
3339         switch ( efab->board_type ) {
3340         case EFAB_BOARD_SFE4001:
3341                 efab->board_op = &sfe4001_ops;
3342                 break;
3343         case EFAB_BOARD_SFE4002:
3344                 efab->board_op = &sfe4002_ops;
3345                 break;
3346         case EFAB_BOARD_SFE4003:
3347                 efab->board_op = &sfe4003_ops;
3348                 break;
3349         default:
3350                 EFAB_ERR ( "Unrecognised board type\n" );
3351                 return -EINVAL;
3352         }
3353
3354         /* Patch in MAC operations */
3355         if ( efab->phy_10g )
3356                 efab->mac_op = &falcon_xmac_operations;
3357         else
3358                 efab->mac_op = &falcon_gmac_operations;
3359
3360         /* Hook in the PHY ops */
3361         switch ( efab->phy_type ) {
3362         case PHY_TYPE_10XPRESS:
3363                 efab->phy_op = &falcon_tenxpress_phy_ops;
3364                 break;
3365         case PHY_TYPE_CX4:
3366                 efab->phy_op = &falcon_xaui_phy_ops;
3367                 break;
3368         case PHY_TYPE_XFP:
3369                 efab->phy_op = &falcon_xfp_phy_ops;
3370                 break;
3371         case PHY_TYPE_CX4_RTMR:
3372                 efab->phy_op = &falcon_txc_phy_ops;
3373                 break;
3374         case PHY_TYPE_PM8358:
3375                 efab->phy_op = &falcon_pm8358_phy_ops;
3376                 break;
3377         case PHY_TYPE_1GIG_ALASKA:
3378                 efab->phy_op = &falcon_alaska_phy_ops;
3379                 break;
3380         default:
3381                 EFAB_ERR ( "Unknown PHY type: %d\n", efab->phy_type );
3382                 return -EINVAL;
3383         }
3384
3385         return 0;
3386 }
3387
3388 static int
3389 falcon_init_sram ( struct efab_nic *efab )
3390 {
3391         efab_oword_t reg;
3392         int count;
3393
3394         /* use card in internal SRAM mode */
3395         falcon_read ( efab, &reg, FCN_NIC_STAT_REG );
3396         EFAB_SET_OWORD_FIELD ( reg, FCN_ONCHIP_SRAM, 1 );
3397         falcon_write ( efab, &reg, FCN_NIC_STAT_REG );
3398
3399         /* Deactivate any external SRAM that might be present */
3400         EFAB_POPULATE_OWORD_2 ( reg, 
3401                                 FCN_GPIO1_OEN, 1,
3402                                 FCN_GPIO1_OUT, 1 );
3403         falcon_write ( efab, &reg, FCN_GPIO_CTL_REG_KER );
3404
3405         /* Initiate SRAM reset */
3406         EFAB_POPULATE_OWORD_2 ( reg,
3407                                 FCN_SRAM_OOB_BT_INIT_EN, 1,
3408                                 FCN_SRM_NUM_BANKS_AND_BANK_SIZE, 0 );
3409         falcon_write ( efab, &reg, FCN_SRM_CFG_REG_KER );
3410
3411         /* Wait for SRAM reset to complete */
3412         count = 0;
3413         do {
3414                 /* SRAM reset is slow; expect around 16ms */
3415                 mdelay ( 20 );
3416
3417                 /* Check for reset complete */
3418                 falcon_read ( efab, &reg, FCN_SRM_CFG_REG_KER );
3419                 if ( !EFAB_OWORD_FIELD ( reg, FCN_SRAM_OOB_BT_INIT_EN ) )
3420                         return 0;
3421         } while (++count < 20); /* wait upto 0.4 sec */
3422
3423         EFAB_ERR ( "timed out waiting for SRAM reset\n");
3424         return -ETIMEDOUT;
3425 }
3426
3427 static void
3428 falcon_setup_nic ( struct efab_nic *efab )
3429 {
3430         efab_dword_t timer_cmd;
3431         efab_oword_t reg;
3432         int tx_fc, xoff_thresh, xon_thresh;
3433
3434         /* bug5129: Clear the parity enables on the TX data fifos as 
3435          * they produce false parity errors because of timing issues 
3436          */
3437         falcon_read ( efab, &reg, FCN_SPARE_REG_KER );
3438         EFAB_SET_OWORD_FIELD ( reg, FCN_MEM_PERR_EN_TX_DATA, 0 );
3439         falcon_write ( efab, &reg, FCN_SPARE_REG_KER );
3440         
3441         /* Set up TX and RX descriptor caches in SRAM */
3442         EFAB_POPULATE_OWORD_1 ( reg, FCN_SRM_TX_DC_BASE_ADR, 0x130000 );
3443         falcon_write ( efab, &reg, FCN_SRM_TX_DC_CFG_REG_KER );
3444         EFAB_POPULATE_OWORD_1 ( reg, FCN_TX_DC_SIZE, 1 /* 16 descriptors */ );
3445         falcon_write ( efab, &reg, FCN_TX_DC_CFG_REG_KER );
3446         EFAB_POPULATE_OWORD_1 ( reg, FCN_SRM_RX_DC_BASE_ADR, 0x100000 );
3447         falcon_write ( efab, &reg, FCN_SRM_RX_DC_CFG_REG_KER );
3448         EFAB_POPULATE_OWORD_1 ( reg, FCN_RX_DC_SIZE, 2 /* 32 descriptors */ );
3449         falcon_write ( efab, &reg, FCN_RX_DC_CFG_REG_KER );
3450         
3451         /* Set number of RSS CPUs
3452          * bug7244: Increase filter depth to reduce RX_RESET likelyhood
3453          */
3454         EFAB_POPULATE_OWORD_5 ( reg,
3455                                 FCN_NUM_KER, 0,
3456                                 FCN_UDP_FULL_SRCH_LIMIT, 8,
3457                                 FCN_UDP_WILD_SRCH_LIMIT, 8,
3458                                 FCN_TCP_WILD_SRCH_LIMIT, 8,
3459                                 FCN_TCP_FULL_SRCH_LIMIT, 8);
3460         falcon_write ( efab, &reg, FCN_RX_FILTER_CTL_REG_KER );
3461         udelay ( 1000 );
3462
3463         /* Setup RX.  Wait for descriptor is broken and must
3464          * be disabled.  RXDP recovery shouldn't be needed, but is.
3465          * disable ISCSI parsing because we don't need it
3466          */
3467         falcon_read ( efab, &reg, FCN_RX_SELF_RST_REG_KER );
3468         EFAB_SET_OWORD_FIELD ( reg, FCN_RX_NODESC_WAIT_DIS, 1 );
3469         EFAB_SET_OWORD_FIELD ( reg, FCN_RX_RECOVERY_EN, 1 );
3470         EFAB_SET_OWORD_FIELD ( reg, FCN_RX_ISCSI_DIS, 1 );
3471         falcon_write ( efab, &reg, FCN_RX_SELF_RST_REG_KER );
3472         
3473         /* Determine recommended flow control settings. *
3474          * Flow control is qualified on B0 and A1/1G, not on A1/10G */
3475         if ( efab->pci_revision == FALCON_REV_B0 ) {
3476                 tx_fc = 1;
3477                 xoff_thresh = 54272;  /* ~80Kb - 3*max MTU */
3478                 xon_thresh = 27648; /* ~3*max MTU */
3479         }
3480         else if ( !efab->phy_10g ) {
3481                 tx_fc = 1;
3482                 xoff_thresh = 2048;
3483                 xon_thresh = 512;
3484         }
3485         else {
3486                 tx_fc = xoff_thresh = xon_thresh = 0;
3487         }
3488
3489         /* Setup TX and RX */
3490         falcon_read ( efab, &reg, FCN_TX_CFG2_REG_KER );
3491         EFAB_SET_OWORD_FIELD ( reg, FCN_TX_DIS_NON_IP_EV, 1 );
3492         falcon_write ( efab, &reg, FCN_TX_CFG2_REG_KER );
3493
3494         falcon_read ( efab, &reg, FCN_RX_CFG_REG_KER );
3495         EFAB_SET_OWORD_FIELD_VER ( efab, reg, FCN_RX_USR_BUF_SIZE,
3496                                    (3*4096) / 32 );
3497         if ( efab->pci_revision == FALCON_REV_B0)
3498                 EFAB_SET_OWORD_FIELD ( reg, FCN_RX_INGR_EN_B0, 1 );
3499         EFAB_SET_OWORD_FIELD_VER ( efab, reg, FCN_RX_XON_MAC_TH,
3500                                    xon_thresh / 256);
3501         EFAB_SET_OWORD_FIELD_VER ( efab, reg, FCN_RX_XOFF_MAC_TH,
3502                                    xoff_thresh / 256);
3503         EFAB_SET_OWORD_FIELD_VER ( efab, reg, FCN_RX_XOFF_MAC_EN, tx_fc);
3504         falcon_write ( efab, &reg, FCN_RX_CFG_REG_KER );
3505
3506         /* Set timer register */
3507         EFAB_POPULATE_DWORD_2 ( timer_cmd,
3508                                 FCN_TIMER_MODE, FCN_TIMER_MODE_DIS,
3509                                 FCN_TIMER_VAL, 0 );
3510         falcon_writel ( efab, &timer_cmd, FCN_TIMER_CMD_REG_KER );
3511 }
3512
3513 static void
3514 falcon_init_resources ( struct efab_nic *efab )
3515 {
3516         struct efab_ev_queue *ev_queue = &efab->ev_queue;
3517         struct efab_rx_queue *rx_queue = &efab->rx_queue;
3518         struct efab_tx_queue *tx_queue = &efab->tx_queue;
3519
3520         efab_oword_t reg;
3521         int jumbo;
3522
3523         /* Initialise the ptrs */
3524         tx_queue->read_ptr = tx_queue->write_ptr = 0;
3525         rx_queue->read_ptr = rx_queue->write_ptr = 0;
3526         ev_queue->read_ptr = 0;
3527
3528         /* Push the event queue to the hardware */
3529         EFAB_POPULATE_OWORD_3 ( reg,
3530                                 FCN_EVQ_EN, 1,
3531                                 FCN_EVQ_SIZE, FQS(FCN_EVQ, EFAB_EVQ_SIZE),
3532                                 FCN_EVQ_BUF_BASE_ID, ev_queue->entry.id );
3533         falcon_write ( efab, &reg, 
3534                        FCN_REVISION_REG ( efab, FCN_EVQ_PTR_TBL_KER ) );
3535         
3536         /* Push the tx queue to the hardware */
3537         EFAB_POPULATE_OWORD_8 ( reg,
3538                                 FCN_TX_DESCQ_EN, 1,
3539                                 FCN_TX_ISCSI_DDIG_EN, 0,
3540                                 FCN_TX_ISCSI_DDIG_EN, 0,
3541                                 FCN_TX_DESCQ_BUF_BASE_ID, tx_queue->entry.id,
3542                                 FCN_TX_DESCQ_EVQ_ID, 0,
3543                                 FCN_TX_DESCQ_SIZE, FQS(FCN_TX_DESCQ, EFAB_TXD_SIZE),
3544                                 FCN_TX_DESCQ_TYPE, 0 /* kernel queue */,
3545                                 FCN_TX_NON_IP_DROP_DIS_B0, 1 );
3546         falcon_write ( efab, &reg, 
3547                        FCN_REVISION_REG ( efab, FCN_TX_DESC_PTR_TBL_KER ) );
3548         
3549         /* Push the rx queue to the hardware */
3550         jumbo = ( efab->pci_revision == FALCON_REV_B0 ) ? 0 : 1;
3551         EFAB_POPULATE_OWORD_8 ( reg,
3552                                 FCN_RX_ISCSI_DDIG_EN, 0,
3553                                 FCN_RX_ISCSI_HDIG_EN, 0,
3554                                 FCN_RX_DESCQ_BUF_BASE_ID, rx_queue->entry.id,
3555                                 FCN_RX_DESCQ_EVQ_ID, 0,
3556                                 FCN_RX_DESCQ_SIZE, FQS(FCN_RX_DESCQ, EFAB_RXD_SIZE),
3557                                 FCN_RX_DESCQ_TYPE, 0 /* kernel queue */,
3558                                 FCN_RX_DESCQ_JUMBO, jumbo,
3559                                 FCN_RX_DESCQ_EN, 1 );
3560         falcon_write ( efab, &reg,
3561                        FCN_REVISION_REG ( efab, FCN_RX_DESC_PTR_TBL_KER ) );
3562
3563         /* Program INT_ADR_REG_KER */
3564         EFAB_POPULATE_OWORD_1 ( reg,
3565                                 FCN_INT_ADR_KER, virt_to_bus ( &efab->int_ker ) );
3566         falcon_write ( efab, &reg, FCN_INT_ADR_REG_KER );
3567
3568         /* Ack the event queue */
3569         falcon_eventq_read_ack ( efab, ev_queue );
3570 }
3571
3572 static void
3573 falcon_fini_resources ( struct efab_nic *efab )
3574 {
3575         efab_oword_t cmd;
3576         
3577         /* Disable interrupts */
3578         falcon_interrupts ( efab, 0, 0 );
3579
3580         /* Flush the dma queues */
3581         EFAB_POPULATE_OWORD_2 ( cmd,
3582                                 FCN_TX_FLUSH_DESCQ_CMD, 1,
3583                                 FCN_TX_FLUSH_DESCQ, 0 );
3584         falcon_write ( efab, &cmd, 
3585                        FCN_REVISION_REG ( efab, FCN_TX_DESC_PTR_TBL_KER ) );
3586
3587         EFAB_POPULATE_OWORD_2 ( cmd,
3588                                 FCN_RX_FLUSH_DESCQ_CMD, 1,
3589                                 FCN_RX_FLUSH_DESCQ, 0 );
3590         falcon_write ( efab, &cmd,
3591                        FCN_REVISION_REG ( efab, FCN_RX_DESC_PTR_TBL_KER ) );
3592
3593         mdelay ( 100 );
3594
3595         /* Remove descriptor rings from card */
3596         EFAB_ZERO_OWORD ( cmd );
3597         falcon_write ( efab, &cmd, 
3598                        FCN_REVISION_REG ( efab, FCN_TX_DESC_PTR_TBL_KER ) );
3599         falcon_write ( efab, &cmd, 
3600                        FCN_REVISION_REG ( efab, FCN_RX_DESC_PTR_TBL_KER ) );
3601         falcon_write ( efab, &cmd, 
3602                        FCN_REVISION_REG ( efab, FCN_EVQ_PTR_TBL_KER ) );
3603 }
3604
3605 /*******************************************************************************
3606  *
3607  *
3608  * Hardware rx path
3609  *
3610  *
3611  *******************************************************************************/
3612
3613 static void
3614 falcon_build_rx_desc ( falcon_rx_desc_t *rxd, struct io_buffer *iob )
3615 {
3616         EFAB_POPULATE_QWORD_2 ( *rxd,
3617                                 FCN_RX_KER_BUF_SIZE, EFAB_RX_BUF_SIZE,
3618                                 FCN_RX_KER_BUF_ADR, virt_to_bus ( iob->data ) );
3619 }
3620
3621 static void
3622 falcon_notify_rx_desc ( struct efab_nic *efab, struct efab_rx_queue *rx_queue )
3623 {
3624         efab_dword_t reg;
3625         int ptr = rx_queue->write_ptr % EFAB_RXD_SIZE;
3626
3627         EFAB_POPULATE_DWORD_1 ( reg, FCN_RX_DESC_WPTR_DWORD, ptr );
3628         falcon_writel ( efab, &reg, FCN_RX_DESC_UPD_REG_KER_DWORD );
3629 }
3630
3631
3632 /*******************************************************************************
3633  *
3634  *
3635  * Hardware tx path
3636  *
3637  *
3638  *******************************************************************************/
3639
3640 static void
3641 falcon_build_tx_desc ( falcon_tx_desc_t *txd, struct io_buffer *iob )
3642 {
3643         EFAB_POPULATE_QWORD_2 ( *txd,
3644                                 FCN_TX_KER_BYTE_CNT, iob_len ( iob ),
3645                                 FCN_TX_KER_BUF_ADR, virt_to_bus ( iob->data ) );
3646 }
3647
3648 static void
3649 falcon_notify_tx_desc ( struct efab_nic *efab,
3650                         struct efab_tx_queue *tx_queue )
3651 {
3652         efab_dword_t reg;
3653         int ptr = tx_queue->write_ptr % EFAB_TXD_SIZE;
3654
3655         EFAB_POPULATE_DWORD_1 ( reg, FCN_TX_DESC_WPTR_DWORD, ptr );
3656         falcon_writel ( efab, &reg, FCN_TX_DESC_UPD_REG_KER_DWORD );
3657 }
3658
3659
3660 /*******************************************************************************
3661  *
3662  *
3663  * Software receive interface
3664  *
3665  *
3666  *******************************************************************************/ 
3667
3668 static int
3669 efab_fill_rx_queue ( struct efab_nic *efab,
3670                      struct efab_rx_queue *rx_queue )
3671 {
3672         int fill_level = rx_queue->write_ptr - rx_queue->read_ptr;
3673         int space = EFAB_NUM_RX_DESC - fill_level - 1;
3674         int pushed = 0;
3675
3676         while ( space ) {
3677                 int buf_id = rx_queue->write_ptr % EFAB_NUM_RX_DESC;
3678                 int desc_id = rx_queue->write_ptr % EFAB_RXD_SIZE;
3679                 struct io_buffer *iob;
3680                 falcon_rx_desc_t *rxd;
3681
3682                 assert ( rx_queue->buf[buf_id] == NULL );
3683                 iob = alloc_iob ( EFAB_RX_BUF_SIZE );
3684                 if ( !iob )
3685                         break;
3686
3687                 EFAB_TRACE ( "pushing rx_buf[%d] iob %p data %p\n",
3688                              buf_id, iob, iob->data );
3689
3690                 rx_queue->buf[buf_id] = iob;
3691                 rxd = rx_queue->ring + desc_id;
3692                 falcon_build_rx_desc ( rxd, iob );
3693                 ++rx_queue->write_ptr;
3694                 ++pushed;
3695                 --space;
3696         }
3697
3698         if ( pushed ) {
3699                 /* Push the ptr to hardware */
3700                 falcon_notify_rx_desc ( efab, rx_queue );
3701
3702                 fill_level = rx_queue->write_ptr - rx_queue->read_ptr;
3703                 EFAB_TRACE ( "pushed %d rx buffers to fill level %d\n",
3704                              pushed, fill_level );
3705         }
3706
3707         if ( fill_level == 0 )
3708                 return -ENOMEM;
3709         return 0;
3710 }
3711         
3712 static void
3713 efab_receive ( struct efab_nic *efab, unsigned int id, int len, int drop )
3714 {
3715         struct efab_rx_queue *rx_queue = &efab->rx_queue;
3716         struct io_buffer *iob;
3717         unsigned int read_ptr = rx_queue->read_ptr % EFAB_RXD_SIZE;
3718         unsigned int buf_ptr = rx_queue->read_ptr % EFAB_NUM_RX_DESC;
3719
3720         assert ( id == read_ptr );
3721         
3722         /* Pop this rx buffer out of the software ring */
3723         iob = rx_queue->buf[buf_ptr];
3724         rx_queue->buf[buf_ptr] = NULL;
3725
3726         EFAB_TRACE ( "popping rx_buf[%d] iob %p data %p with %d bytes %s\n",
3727                      id, iob, iob->data, len, drop ? "bad" : "ok" );
3728
3729         /* Pass the packet up if required */
3730         if ( drop )
3731                 free_iob ( iob );
3732         else {
3733                 iob_put ( iob, len );
3734                 netdev_rx ( efab->netdev, iob );
3735         }
3736
3737         ++rx_queue->read_ptr;
3738 }
3739
3740 /*******************************************************************************
3741  *
3742  *
3743  * Software transmit interface
3744  *
3745  *
3746  *******************************************************************************/