Changeset 4d3c866 in rtems


Ignore:
Timestamp:
Sep 20, 2016, 10:14:45 PM (3 years ago)
Author:
Pavel Pisa <pisa@…>
Branches:
master
Children:
a396ed4
Parents:
f6142c19
git-author:
Pavel Pisa <pisa@…> (09/20/16 22:14:45)
git-committer:
Pavel Pisa <pisa@…> (09/21/16 08:24:59)
Message:

classic networking: adapt FXP driver to work with actual PCI and IRQ code.

Tested to work with QEMU provided Intel i82557b network controller emulation.

qemu-system-x86_64 -enable-kvm -kernel $APP_BINARY \

-vga cirrus \
-append "--console=/dev/com1" \
-serial stdio \
-net nic,vlan=1,macaddr=be:be:be:10:00:01,model=i82557b \
-net tap,ifname=tap1,vlan=1,script=no,downscript=no

Location:
c/src/libchip/network
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/libchip/network/if_fxp.c

    rf6142c19 r4d3c866  
    7777#include <bsp.h>
    7878#include <bsp/irq.h>
     79#include <bsp/irq-generic.h>
    7980#include <rtems/pci.h>
    8081
     
    222223
    223224
    224 static rtems_isr        fxp_intr(rtems_vector_number v);
     225static void             fxp_intr(void *arg);
    225226static void             fxp_init(void *xsc);
    226227static void             fxp_tick(void *xsc);
     
    286287  }
    287288  else {
    288     val = *(u_int8_t*)(sc->pci_regs_base+reg);
     289    val = *(volatile u_int8_t*)(sc->pci_regs_base+reg);
    289290  }
    290291  return val;
     
    296297  }
    297298  else {
    298     val = *(u_int16_t*)(sc->pci_regs_base+reg);
     299    val = *(volatile u_int16_t*)(sc->pci_regs_base+reg);
    299300  }
    300301  return val;
     
    306307  }
    307308  else {
    308     val = *(u_int32_t*)(sc->pci_regs_base+reg);
     309    val = *(volatile u_int32_t*)(sc->pci_regs_base+reg);
    309310  }
    310311  return val;
     
    323324                DELAY(2);
    324325        if (i == 0)
    325                 device_printf(sc->dev, "SCB timeout: 0x%x 0x%x 0x%x 0x%x\n",
     326                device_printf(sc->dev, "SCB timeout: 0x%d 0x%d"
     327                                        "0x%d" PRIx32 "0x%" PRIx32 "\n",
    326328                    CSR_READ_1(sc, FXP_CSR_SCB_COMMAND),
    327329                    CSR_READ_1(sc, FXP_CSR_SCB_STATACK),
     
    352354}
    353355
    354 /*
    355  * These macros and instantiations define PCI Configuration Space accessors
    356  * which use the legacy API based on the PCI BIOS only used by pc386.
    357  * This was the only device driver using these.
    358  *
    359  * TBD: It may be worth it to fix this driver to use the current PCI API rather
    360  *      than this legacy PC386 API.
    361  */
    362 #define PCIB_DEVSIG_BUS(x) (((x)>>8) &0xff)
    363 #define PCIB_DEVSIG_DEV(x) (((x)>>3) & 0x1f)
    364 #define PCIB_DEVSIG_FUNC(x) ((x) & 0x7)
    365 #define PCIB_DEVSIG_MAKE(b,d,f) ((b<<8)|(d<<3)|(f))
    366 
    367 #define PCI_CONF_ACCESSOR(_confop, _baseop, _type) \
    368   /* prototype before body */ \
    369   static inline int _confop ( \
    370     int signature, \
    371     int offset, \
    372     _type data ); \
     356
     357#define FXP_PCI_CONF_ACCESSOR(_confop, _baseop, _type) \
    373358  \
    374359  static inline int _confop ( \
    375     int signature, \
     360    struct fxp_softc *sc, \
    376361    int offset, \
    377362    _type data ) \
    378363  { \
    379364    _baseop( \
    380         PCIB_DEVSIG_BUS(signature), \
    381         PCIB_DEVSIG_DEV(signature), \
    382         PCIB_DEVSIG_FUNC(signature), \
     365        sc->pci_bus, \
     366        sc->pci_dev, \
     367        sc->pci_fun, \
    383368        offset, \
    384369        data \
     
    387372  }
    388373
    389 PCI_CONF_ACCESSOR( pcib_conf_read8,   pci_read_config_byte,   uint8_t * );
    390 PCI_CONF_ACCESSOR( pcib_conf_read16,  pci_read_config_word,   uint16_t * );
    391 PCI_CONF_ACCESSOR( pcib_conf_read32,  pci_read_config_dword,  uint32_t * );
    392 PCI_CONF_ACCESSOR( pcib_conf_write8,  pci_write_config_byte,  uint8_t );
    393 PCI_CONF_ACCESSOR( pcib_conf_write16, pci_write_config_word,  uint16_t );
    394 PCI_CONF_ACCESSOR( pcib_conf_write32, pci_write_config_dword, uint32_t );
    395 
    396 static __inline unsigned int pci_get_vendor(struct fxp_softc *sc) {
     374FXP_PCI_CONF_ACCESSOR( fxp_pci_conf_read8,   pci_read_config_byte,   uint8_t * );
     375FXP_PCI_CONF_ACCESSOR( fxp_pci_conf_read16,  pci_read_config_word,   uint16_t * );
     376FXP_PCI_CONF_ACCESSOR( fxp_pci_conf_read32,  pci_read_config_dword,  uint32_t * );
     377FXP_PCI_CONF_ACCESSOR( fxp_pci_conf_write8,  pci_write_config_byte,  uint8_t );
     378FXP_PCI_CONF_ACCESSOR( fxp_pci_conf_write16, pci_write_config_word,  uint16_t );
     379FXP_PCI_CONF_ACCESSOR( fxp_pci_conf_write32, pci_write_config_dword, uint32_t );
     380
     381static __inline unsigned int fxp_pci_get_vendor(struct fxp_softc *sc) {
    397382  u_int16_t vendor;
    398   pcib_conf_read16(sc->pci_signature,0,&vendor);
     383  fxp_pci_conf_read16(sc, PCI_VENDOR_ID, &vendor);
    399384  return vendor;
    400385}
    401386
    402 static __inline unsigned int pci_get_device(struct fxp_softc *sc) {
     387static __inline unsigned int fxp_pci_get_device(struct fxp_softc *sc) {
    403388  u_int16_t device;
    404   pcib_conf_read16(sc->pci_signature,2,&device);
     389  fxp_pci_conf_read16(sc, PCI_DEVICE_ID, &device);
    405390  return device;
    406391}
    407392
    408 static __inline unsigned int pci_get_subvendor(struct fxp_softc *sc) {
     393static __inline unsigned int fxp_pci_get_subvendor(struct fxp_softc *sc) {
    409394  u_int16_t subvendor;
    410   pcib_conf_read16(sc->pci_signature,0x2c,&subvendor);
     395  fxp_pci_conf_read16(sc, PCI_SUBSYSTEM_VENDOR_ID, &subvendor);
    411396  return subvendor;
    412397}
    413398
    414 static __inline unsigned int pci_get_subdevice(struct fxp_softc *sc) {
     399static __inline unsigned int fxp_pci_get_subdevice(struct fxp_softc *sc) {
    415400  u_int16_t subdevice;
    416   pcib_conf_read16(sc->pci_signature,0x2e,&subdevice);
     401  fxp_pci_conf_read16(sc, PCI_SUBSYSTEM_ID, &subdevice);
    417402  return subdevice;
    418403}
    419404
    420 static __inline unsigned int pci_get_revid(struct fxp_softc *sc) {
     405static __inline unsigned int fxp_pci_get_revid(struct fxp_softc *sc) {
    421406  u_int8_t revid;
    422   pcib_conf_read8(sc->pci_signature,0x08,&revid);
     407  fxp_pci_conf_read8(sc, PCI_REVISION_ID, &revid);
    423408  return revid;
    424 }
    425 
    426 static void nopOn(const rtems_irq_connect_data* notUsed)
    427 {
    428   /*
    429    * code should be moved from fxp_Enet_initialize_hardware
    430    * to this location
    431    */
    432409}
    433410
     
    486463         * find device on pci bus
    487464         */
    488     { int j; int pbus, pdev, pfun;
    489 
    490       for (j=0; fxp_ident_table[j].devid; j++ ) {
    491                     i = pci_find_device( 0x8086, fxp_ident_table[j].devid,
    492                                unitNumber-1, &pbus, &pdev, &pfun );
    493                     sc->pci_signature =  PCIB_DEVSIG_MAKE( pbus, pdev, pfun );
    494                     DBGLVL_PRINTK(2,"fxp_attach: find_devid returned %d "
    495                       "and pci signature 0x%x\n",
    496                       i,sc->pci_signature);
    497         if (PCIB_ERR_SUCCESS == i) {
    498                     if ( UNTESTED == fxp_ident_table[j].warn ) {
    499                           device_printf(dev,
     465        { int j; int pbus, pdev, pfun;
     466
     467                for (j=0; fxp_ident_table[j].devid; j++ ) {
     468                        i = pci_find_device( 0x8086, fxp_ident_table[j].devid,
     469                                unitNumber-1, &pbus, &pdev, &pfun );
     470                        sc->pci_bus = pbus;
     471                        sc->pci_dev = pdev;
     472                        sc->pci_fun = pfun;
     473                        DBGLVL_PRINTK(2,"fxp_attach: find_devid returned %d ,"
     474                                        "pci bus %d dev %d fun %d \n",
     475                                        i, sc->pci_bus, sc->pci_dev, sc->pci_fun);
     476                        if (PCIB_ERR_SUCCESS == i) {
     477                                if ( UNTESTED == fxp_ident_table[j].warn ) {
     478                                        device_printf(dev,
    500479"WARNING: this chip version has NOT been reported to work under RTEMS yet.\n");
    501                             device_printf(dev,
     480                                        device_printf(dev,
    502481"         If it works OK, report it as tested in 'c/src/libchip/network/if_fxp.c'\n");
    503                           }
    504                         break;
    505                   }
    506           }
     482                                }
     483                                break;
     484                        }
     485                }
    507486        }
    508487
     
    520499         * BIOS/Prom forgot about it.
    521500         */
    522         pcib_conf_read16(sc->pci_signature, PCI_COMMAND,&val16);
     501        fxp_pci_conf_read16(sc, PCI_COMMAND,&val16);
    523502        val16 |= (PCI_COMMAND_MEMORY|PCI_COMMAND_MASTER);
    524         pcib_conf_write16(sc->pci_signature, PCI_COMMAND, val16);
     503        fxp_pci_conf_write16(sc, PCI_COMMAND, val16);
    525504        DBGLVL_PRINTK(3,"fxp_attach: PCI_COMMAND_write = 0x%x\n",val16);
    526         pcib_conf_read16(sc->pci_signature, PCI_COMMAND,&val16);
     505        fxp_pci_conf_read16(sc, PCI_COMMAND,&val16);
    527506        DBGLVL_PRINTK(4,"fxp_attach: PCI_COMMAND_read  = 0x%x\n",val16);
    528507
     
    595574         * get mapping and base address of registers
    596575         */
    597         pcib_conf_read16(sc->pci_signature, PCI_COMMAND,&val16);
     576        fxp_pci_conf_read16(sc, PCI_COMMAND,&val16);
    598577        DBGLVL_PRINTK(4,"fxp_attach: PCI_COMMAND_read  = 0x%x\n",val16);
    599578        if((val16 & PCI_COMMAND_IO) != 0) {
    600579          sc->pci_regs_are_io = true;
    601           pcib_conf_read32(sc->pci_signature,
    602                            PCI_BASE_ADDRESS_1,
    603                            &val32);
     580          fxp_pci_conf_read32(sc, PCI_BASE_ADDRESS_1, &val32);
    604581          sc->pci_regs_base = val32 & PCI_BASE_ADDRESS_IO_MASK;
    605582        }
    606583        else {
    607584          sc->pci_regs_are_io = false;
    608           pcib_conf_read32(sc->pci_signature,
    609                            PCI_BASE_ADDRESS_0,
    610                            &val32);
     585          fxp_pci_conf_read32(sc, PCI_BASE_ADDRESS_0, &val32);
    611586          sc->pci_regs_base = val32 & PCI_BASE_ADDRESS_MEM_MASK;
    612587        }
     
    619594         * get interrupt level to be used
    620595         */
    621         pcib_conf_read8(sc->pci_signature, 60, &interrupt);
     596        fxp_pci_conf_read8(sc, PCI_INTERRUPT_LINE, &interrupt);
    622597        DBGLVL_PRINTK(3,"fxp_attach: interrupt = 0x%x\n",interrupt);
    623         sc->irqInfo.name = (rtems_irq_number)interrupt;
     598        sc->irq_num = interrupt;
    624599        /*
    625600         * Reset to a stable state.
     
    694669         */
    695670#ifdef NOTUSED
    696         i = pci_get_device(dev);
     671        i = fxp_pci_get_device(dev);
    697672#else
    698         pcib_conf_read16(sc->pci_signature,2,&dev_id);
     673        fxp_pci_conf_read16(sc, PCI_DEVICE_ID, &dev_id);
    699674        DBGLVL_PRINTK(3,"fxp_attach: device id = 0x%x\n",dev_id);
    700675#endif
     
    752727                 * the board to turn on MWI.
    753728                 */
    754                 pcib_conf_read8(sc->pci_signature,
    755                                 PCI_CACHE_LINE_SIZE,&tmp_val);
     729                fxp_pci_conf_read8(sc, PCI_CACHE_LINE_SIZE, &tmp_val);
    756730                DBGLVL_PRINTK(3,"fxp_attach: CACHE_LINE_SIZE = %d\n",tmp_val);
    757731                if (val16 & PCI_COMMAND_MEMORY &&
     
    782756            sc->flags & FXP_FLAG_SERIAL_MEDIA ? ", 10Mbps" : "");
    783757                device_printf(dev, "PCI IDs: 0x%x 0x%x 0x%x 0x%x 0x%x\n",
    784                     pci_get_vendor(sc), pci_get_device(sc),
    785                     pci_get_subvendor(sc), pci_get_subdevice(sc),
    786                     pci_get_revid(sc));
     758                    fxp_pci_get_vendor(sc), fxp_pci_get_device(sc),
     759                    fxp_pci_get_subvendor(sc), fxp_pci_get_subdevice(sc),
     760                    fxp_pci_get_revid(sc));
    787761                device_printf(dev, "Chip Type: %d\n", sc->chip);
    788762        }
     
    11571131        struct fxp_softc *sc = ifp->if_softc;
    11581132        struct fxp_cb_tx *txp;
     1133        rtems_interrupt_level level;
    11591134
    11601135        DBGLVL_PRINTK(3,"fxp_start called\n");
     
    11661141         */
    11671142        if (sc->need_mcsetup) {
     1143                DBGLVL_PRINTK(3,"fxp_start need_mcsetup\n");
    11681144                return;
    11691145        }
     
    13001276                fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_RESUME);
    13011277        }
     1278
     1279        /*
     1280         * reenable interrupts
     1281         */
     1282        rtems_interrupt_disable (level);
     1283        CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL,0);
     1284        bsp_interrupt_vector_enable(sc->irq_num);
     1285        rtems_interrupt_enable (level);
    13021286}
    13031287
     
    13051289 * Process interface interrupts.
    13061290 */
    1307 static rtems_isr fxp_intr(rtems_vector_number v)
     1291static void fxp_intr(void *arg)
    13081292{
    13091293  /*
    1310    * FIXME: currently only works with one interface...
     1294   * Obtain device state
    13111295   */
    1312   struct fxp_softc *sc = &(fxp_softc[0]);
     1296  struct fxp_softc *sc = (struct fxp_softc *)arg;
    13131297
    13141298  /*
     
    13371321        for (;;) {
    13381322
    1339         DBGLVL_PRINTK(4,"fxp_daemon waiting for event\n");
     1323        DBGLVL_PRINTK(4,"fxp_daemon waiting for event, INTRCNTL 0x%02x\n",
     1324                      CSR_READ_1(sc,  FXP_CSR_SCB_INTRCNTL));
    13401325          /*
    13411326           * wait for event to receive from interrupt function
     
    14761461          rtems_interrupt_disable (level);
    14771462          CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL,0);
     1463          bsp_interrupt_vector_enable(sc->irq_num);
    14781464          rtems_interrupt_enable (level);
    14791465        }
     
    16981684        struct fxp_cb_tx *txp;
    16991685        int i, prm, s, rv;
     1686        rtems_status_code statcode;
    17001687
    17011688rtems_task_wake_after(100);
     
    19261913                 * Set up interrupts
    19271914                 */
    1928                 sc->irqInfo.hdl = (rtems_irq_hdl)fxp_intr;
    1929                 sc->irqInfo.on  = nopOn;
    1930                 sc->irqInfo.off = nopOn;
    1931                 sc->irqInfo.isOn = NULL;
    1932                 rv = BSP_install_rtems_irq_handler (&sc->irqInfo);
    1933                 if (rv != 1) {
     1915                statcode = rtems_interrupt_handler_install(
     1916                        sc->irq_num,
     1917                        "fxp_intr",
     1918                        RTEMS_INTERRUPT_SHARED,
     1919                        fxp_intr,
     1920                        sc
     1921                );
     1922
     1923                if ( statcode != RTEMS_SUCCESSFUL ) {
    19341924                  rtems_panic ("Can't attach fxp interrupt handler for irq %d\n",
    1935                                sc->irqInfo.name);
     1925                               sc->irq_num);
    19361926                }
    19371927        }
  • c/src/libchip/network/if_fxpvar.h

    rf6142c19 r4d3c866  
    105105        bus_space_handle_t sc_sh;       /* bus space handle */
    106106#else
    107         int pci_signature;              /* RTEMS i386 PCI signature */
    108         bool pci_regs_are_io;           /* RTEMS dev regs are I/O mapped */
    109         u_int32_t pci_regs_base;        /* RTEMS i386 register base */
    110         rtems_id daemonTid;             /* Task ID of deamon        */
    111         rtems_irq_connect_data  irqInfo;
     107        unsigned char pci_bus;          /* RTEMS PCI bus number */
     108        unsigned char pci_dev;          /* RTEMS PCI slot/device number */
     109        unsigned char pci_fun;          /* RTEMS PCI function number */
     110        bool pci_regs_are_io;           /* RTEMS dev regs are I/O mapped */
     111        u_int32_t pci_regs_base;        /* RTEMS i386 register base */
     112        rtems_id daemonTid;             /* Task ID of deamon        */
     113        rtems_vector_number irq_num;
    112114
    113115#endif
     
    176178       outport_byte((sc)->pci_regs_base+(reg),val);                     \
    177179     else                                                               \
    178        *((u_int8_t*)((sc)->pci_regs_base)+(reg)) = val;                \
     180       *((volatile u_int8_t*)((sc)->pci_regs_base)+(reg)) = val;                \
    179181  }while (0)
    180182
     
    184186       outport_word((sc)->pci_regs_base+(reg),val);                     \
    185187     else                                                               \
    186        *((u_int16_t*)((u_int8_t*)((sc)->pci_regs_base)+(reg))) = val; \
     188       *((volatile u_int16_t*)((u_int8_t*)((sc)->pci_regs_base)+(reg))) = val; \
    187189  }while (0)
    188190
     
    192194       outport_long((sc)->pci_regs_base+(reg),val);                     \
    193195     else                                                               \
    194        *((u_int32_t*)((u_int8_t*)((sc)->pci_regs_base)+(reg))) = val; \
     196       *((volatile u_int32_t*)((u_int8_t*)((sc)->pci_regs_base)+(reg))) = val; \
    195197  }while (0)
    196198
Note: See TracChangeset for help on using the changeset viewer.