Example #1
0
int bde_create(void)
{
    linux_bde_bus_t bus;
    bus.be_pio = SYS_BE_PIO;
    bus.be_packet = SYS_BE_PACKET;
    bus.be_other = SYS_BE_OTHER;
    return linux_bde_create(&bus, &bde);
}
Example #2
0
/*
 * Function: _init
 *
 * Purpose:
 *    Module initialization.
 *    Attaches to kernel BDE.
 * Parameters:
 *    None
 * Returns:
 *    Always 0
 */
static int
_init(void)
{
    int i;
    uint32 pbase, dmasize;
    bde_inst_resource_t *res;

    /* Connect to the kernel bde */
    if ((linux_bde_create(NULL, &user_bde) < 0) || user_bde == NULL) {
        return -ENODEV;
    }

    init_waitqueue_head(&_ether_interrupt_wq);

    lkbde_get_dma_info(&pbase, &dmasize);

    memset(&_dma_pool, 0, sizeof(_dma_pool));
    _dma_pool.pbase = pbase;
    _dma_pool.total_size = dmasize / ONE_MB;

    memset(_devices, 0, sizeof(_devices));

    /* Use _bde_inst_resource[0] as the default resource */
    memset(_bde_inst_resource, 0, sizeof(_bde_inst_resource));
    res = &_bde_inst_resource[0];
    res->dma_offset = 0;
    res->dma_size = _dma_pool.total_size;
    init_waitqueue_head(&res->intr_wq);
    atomic_set(&res->intr, 0);

    for (i = 0; i < user_bde->num_devices(BDE_ALL_DEVICES); i++) {
        /* Initialize our control info */
        _devices[i].dev_type = user_bde->get_dev_type(i);
        _devices[i].devid = user_bde->get_dev(i)->device;
        _devices[i].inst = 0;
        res->inst_id |= (1 << i);
        if (BDE_DEV_MEM_MAPPED(_devices[i].dev_type)) {
            _devices[i].enabled = 0;
            _devices[i].ba = lkbde_get_dev_virt(i);
        }
        if (_devices[i].dev_type & BDE_SWITCH_DEV_TYPE) {
            switch (user_bde->get_dev(i)->device) {
            case QE2000_DEVICE_ID:
                _devices[i].isr = (isr_f)_qe2k_interrupt;
                break;
            case BCM88020_DEVICE_ID:
                _devices[i].isr = (isr_f)_fe2k_interrupt;
                break;
            case BCM88025_DEVICE_ID:
                _devices[i].isr = (isr_f)_fe2kxt_interrupt;
                break;
            case BME3200_DEVICE_ID:
                _devices[i].isr = (isr_f)_bme3200_interrupt;
                break;
            case BM9600_DEVICE_ID:
                _devices[i].isr = (isr_f)_bm9600_interrupt;
                break;

            case BCM88750_DEVICE_ID:
            case BCM88753_DEVICE_ID:
            case BCM88754_DEVICE_ID:
            case BCM88755_DEVICE_ID:

                _devices[i].isr = (isr_f)_bcm88750_interrupt;
                break;
            /* FIXME: might use _devices[i].dev_type & BDE_AXI_DEV_TYPE*/
            case BCM88670_DEVICE_ID:
            case BCM88671_DEVICE_ID:
            case BCM88671M_DEVICE_ID:
            case BCM88673_DEVICE_ID:
            case BCM88674_DEVICE_ID:
            case BCM88675_DEVICE_ID:
            case BCM88675M_DEVICE_ID:
            case BCM88676_DEVICE_ID:
            case BCM88676M_DEVICE_ID:
            case BCM88678_DEVICE_ID:
            case BCM88679_DEVICE_ID:
            case BCM88370_DEVICE_ID:
            case BCM88371_DEVICE_ID:
            case BCM88371M_DEVICE_ID:
            case BCM88375_DEVICE_ID:
            case BCM88376_DEVICE_ID:
            case BCM88376M_DEVICE_ID:
            case BCM88377_DEVICE_ID:
            case BCM88378_DEVICE_ID:
            case BCM88379_DEVICE_ID:
            case BCM88770_DEVICE_ID:
            case BCM88773_DEVICE_ID:
            case BCM88774_DEVICE_ID:
            case BCM88775_DEVICE_ID:
            case BCM88776_DEVICE_ID:
            case BCM88470_DEVICE_ID:
            case BCM88950_DEVICE_ID:
            case BCM88953_DEVICE_ID:
            case BCM88954_DEVICE_ID:
            case BCM88955_DEVICE_ID:
            case BCM88956_DEVICE_ID:
                _devices[i].isr = (isr_f)_cmicd_interrupt;
                break;
            default:
                _devices[i].isr = (isr_f)_cmic_interrupt;
                if ((_devices[i].dev_type & BDE_256K_REG_SPACE) &&
#ifdef BCM_PETRA_SUPPORT /* FIXME remove code when hardware design is fixed */
                    _devices[i].devid != 0x1234 &&
#endif
                    readl(_devices[i].ba + CMICE_DEV_REV_ID) == 0) {
                    _devices[i].isr = (isr_f)_cmicm_interrupt;
                }
                break;
            }
            if (_intr_mode_str(_devices[i].isr) == NULL) {
                gprintk("Warning: Unknown interrupt mode\n");
            }
        }
    }
    return 0;
}