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); }
/* * 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; }