Changeset f552470 in libbsdport


Ignore:
Timestamp:
Jul 21, 2011, 11:24:54 PM (8 years ago)
Author:
Till Straumann <strauman@…>
Branches:
master
Children:
af30847
Parents:
88f653a
Message:

2011-07-21 Till Straumann <Till.Straumann@…>

  • if_em/e1000_osdep.h, if_em/e1000_osdep.c, if_em/if_em.c: added e1000_register()/e1000_unregister() to keep track of devices that are 'in-use'. This allows for sharing the low-level code between bsdnet and standalone drivers (e.g., for PtP GigE links).
Location:
bsd_eth_drivers
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • bsd_eth_drivers/ChangeLog

    r88f653a rf552470  
     12011-07-21 Till Straumann <Till.Straumann@TU-Berlin.de>
     2
     3        * if_em/e1000_osdep.h, if_em/e1000_osdep.c, if_em/if_em.c:
     4        added e1000_register()/e1000_unregister() to keep track of
     5        devices that are 'in-use'. This allows for sharing the low-level
     6        code between bsdnet and standalone drivers (e.g., for PtP
     7        GigE links).
     8
    192011-07-20 Till Straumann <Till.Straumann@TU-Berlin.de>
    210       
  • bsd_eth_drivers/if_em/e1000_osdep.c

    r88f653a rf552470  
    5050#endif
    5151
     52#define PCISIG_INVAL 0xffffffff
     53
     54#define PCISIG_MK(b,d,f) ( ((b)<<8) | (((d)&0x1f)<<3) | ((f)&7) )
     55
     56#define PCISIG_BUS(sig)  ( ((sig) >> 8) & 0xffffff )
     57#define PCISIG_DEV(sig)  ( ((sig) >> 3) & 0x1f     )
     58#define PCISIG_FUN(sig)  (  (sig)       & 0x07     )
     59
     60
     61static uint32_t e1k_devs[]={
     62        PCISIG_INVAL,
     63        PCISIG_INVAL,
     64        PCISIG_INVAL,
     65        PCISIG_INVAL,
     66        PCISIG_INVAL,
     67        PCISIG_INVAL,
     68        PCISIG_INVAL,
     69        PCISIG_INVAL
     70};
     71
     72#define N_E1K_DEVS (sizeof(e1k_devs)/sizeof(e1k_devs[0]))
     73
    5274void
    5375e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
    5476{
    55 struct e1000_pcisig *s = hw->back;
    56         pci_write_config_word( s->bus, s->dev, s->fun, reg, *value );
     77struct e1000_pcisig *s_p = hw->back;
     78uint32_t             s   = s_p->sig;
     79
     80        pci_write_config_word( PCISIG_BUS(s), PCISIG_DEV(s), PCISIG_FUN(s), reg, *value );
    5781}
    5882
     
    6084e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
    6185{
    62 struct e1000_pcisig *s = hw->back;
    63         pci_read_config_word( s->bus, s->dev, s->fun, reg, value );
     86struct e1000_pcisig *s_p = hw->back;
     87uint32_t             s   = s_p->sig;
     88        pci_read_config_word( PCISIG_BUS(s), PCISIG_DEV(s), PCISIG_FUN(s), reg, value );
    6489}
    6590
     
    6792e1000_pci_set_mwi(struct e1000_hw *hw)
    6893{
    69 struct e1000_pcisig *s = hw->back;
    70         pci_write_config_word( s->bus, s->dev, s->fun, PCIR_COMMAND,
    71             (hw->bus.pci_cmd_word | CMD_MEM_WRT_INVALIDATE) );
     94uint16_t v = (hw->bus.pci_cmd_word | CMD_MEM_WRT_INVALIDATE);
     95        e1000_write_pci_cfg( hw, PCIR_COMMAND, &v );
    7296}
    7397
     
    7599e1000_pci_clear_mwi(struct e1000_hw *hw)
    76100{
    77 struct e1000_pcisig *s = hw->back;
    78         pci_write_config_word( s->bus, s->dev, s->fun, PCIR_COMMAND,
    79             (hw->bus.pci_cmd_word & ~CMD_MEM_WRT_INVALIDATE) );
     101uint16_t v = (hw->bus.pci_cmd_word & ~CMD_MEM_WRT_INVALIDATE);
     102        e1000_write_pci_cfg( hw, PCIR_COMMAND, &v );
    80103}
    81104
     
    116139{
    117140        free ( hw->dev_spec );
     141        hw->dev_spec = 0;
    118142}
    119143
     
    157181        }
    158182}
     183
     184int
     185e1000_register(struct e1000_pcisig *s_p, unsigned b, unsigned d, unsigned f )
     186{
     187int      i,j,key;
     188uint32_t sig = PCISIG_MK(b,d,f);
     189
     190        if ( PCISIG_INVAL == sig )
     191                return -1;
     192
     193        j = -1;
     194
     195        rtems_interrupt_disable(key);
     196        for ( i = 0; i<N_E1K_DEVS; i++ ) {
     197                if ( PCISIG_INVAL == e1k_devs[i] ) {
     198                        j = i;
     199                } else if ( sig == e1k_devs[i] ) {
     200                        j = -1;
     201                        break;
     202                }
     203        }
     204        if ( j >= 0 ) {
     205                e1k_devs[j] = sig;
     206                if ( s_p )
     207                        s_p->sig = sig;
     208        }
     209        rtems_interrupt_enable(key);
     210
     211        return j < 0;
     212}
     213
     214void
     215e1000_unregister(struct e1000_pcisig *s_p)
     216{
     217int      i,key;
     218uint32_t sig = s_p ? s_p->sig : PCISIG_INVAL;
     219
     220        if ( PCISIG_INVAL == sig )
     221                return;
     222
     223        rtems_interrupt_disable(key);
     224        for ( i = 0; i<N_E1K_DEVS; i++ ) {
     225                if ( sig == e1k_devs[i] ) {
     226                        e1k_devs[i] = PCISIG_INVAL;
     227                        if ( s_p )
     228                                s_p->sig = PCISIG_INVAL;
     229                        break;
     230                }
     231        }
     232        rtems_interrupt_enable(key);
     233}
  • bsd_eth_drivers/if_em/e1000_osdep.h

    r88f653a rf552470  
    8888
    8989struct e1000_pcisig {
    90         uint16_t bus;
    91         uint8_t  dev;
    92         uint8_t  fun;
     90        uint32_t sig;
    9391};
     92
     93/* Register an instance; if this returns nonzero
     94 * then registration failed and the device with
     95 * the pci signature passed in MUST NOT be used
     96 * (since it is already in use by another driver).
     97 */
     98int
     99e1000_register(struct e1000_pcisig *sig_p_out, unsigned bus, unsigned dev, unsigned fun);
     100
     101void
     102e1000_unregister(struct e1000_pcisig *sig_p);
    94103
    95104#ifdef NO_82542_SUPPORT
  • bsd_eth_drivers/if_em/if_em.c

    r88f653a rf552470  
    442442        INIT_DEBUGOUT("em_probe: begin");
    443443
    444 #ifdef __rtems__
    445         /* copy PCI signature to the low-level (bsd-agnostic) support
    446          * struct.
    447          */
    448         {
    449         struct adapter *adapter = device_get_softc(dev);
    450                 adapter->osdep.pcisig.bus = dev->bushdr.pci.bus;
    451                 adapter->osdep.pcisig.dev = dev->bushdr.pci.dev;
    452                 adapter->osdep.pcisig.fun = dev->bushdr.pci.fun;
    453         }
    454 #endif
    455 
    456444        pci_vendor_id = pci_get_vendor(dev);
    457445        if (pci_vendor_id != EM_VENDOR_ID)
     
    472460                    ((pci_subdevice_id == ent->subdevice_id) ||
    473461                    (ent->subdevice_id == PCI_ANY_ID))) {
     462#ifdef __rtems__
     463                        /* Copy PCI signature to the low-level (bsd-agnostic)
     464                         * support struct and register with ll-support. This
     465                         * step also detects if the device is already in use.
     466                         */
     467                        {
     468                                struct adapter *adapter = device_get_softc(dev);
     469
     470                                if ( e1000_register( &adapter->osdep.pcisig,
     471                                                     dev->bushdr.pci.bus,
     472                                                     dev->bushdr.pci.dev,
     473                                                     dev->bushdr.pci.fun ) ) {
     474                                        return (EBUSY);
     475                                }
     476                        }
     477#endif
    474478                        sprintf(adapter_name, "%s %s",
    475479                                em_strings[ent->index],
     
    836840        EM_LOCK_DESTROY(adapter);
    837841
     842#ifdef __rtems__
     843        e1000_unregister( &adapter->osdep.pcisig );
     844#endif
     845
    838846        return (error);
    839847}
     
    910918
    911919        EM_LOCK_DESTROY(adapter);
     920
     921#ifdef __rtems__
     922        e1000_unregister( &adapter->osdep.pcisig );
     923#endif
    912924
    913925        return (0);
Note: See TracChangeset for help on using the changeset viewer.