哪里获取 db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);//dm9k平台设备所所使用的IO地址资源 db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);//dm9k平台设备所所使用的IO数据资源 db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); //dm9k平台设备所所使用中断资源
if (db->addr_res == NULL || db->data_res == NULL || db->irq_res == NULL) { dev_err(db->dev, "insufficient resources\n"); ret = -ENOENT; goto out; } //获取dm9k平台设备所使用的中断号 db->irq_wake = platform_get_irq(pdev, 1); if (db->irq_wake >= 0) { dev_dbg(db->dev, "wakeup irq %d\n", db->irq_wake); //申请中断 ret = request_irq(db->irq_wake, dm9000_wol_interrupt, IRQF_SHARED, dev_name(db->dev), ndev); if (ret) { dev_err(db->dev, "cannot get wakeup irq (%d)\n", ret); } else {
/* test to see if irq is really wakeup capable */ ret = irq_set_irq_wake(db->irq_wake, 1); if (ret) { dev_err(db->dev, "irq %d cannot set wakeup (%d)\n", db->irq_wake, ret); ret = 0; } else { irq_set_irq_wake(db->irq_wake, 0); db->wake_supported = 1; } } } /*计算上面所获取到的IO地址平台资源的大小*/ iosize = resource_size(db->addr_res); //为IO地址空间分配IO内存 db->addr_req = request_mem_region(db->addr_res->start, iosize, pdev->name);//物理
if (db->addr_req == NULL) { dev_err(db->dev, "cannot claim address reg area\n"); ret = -EIO; goto out; } //在访问IO内存之前必须映射IO内存 db->io_addr = ioremap(db->addr_res->start, iosize);//虚拟地址
if (db->io_addr == NULL) { dev_err(db->dev, "failed to ioremap address reg\n"); ret = -EINVAL; goto out; }
iosize = resource_size(db->data_res); db->data_req = request_mem_region(db->data_res->start, iosize, pdev->name);
if (db->data_req == NULL) { dev_err(db->dev, "cannot claim data reg area\n"); ret = -EIO; goto out; }
db->io_data = ioremap(db->data_res->start, iosize);
if (db->io_data == NULL) { dev_err(db->dev, "failed to ioremap data reg\n"); ret = -EINVAL; goto out; } /* fill in parameters for net-dev structure */ ndev->base_addr = (unsigned long)db->io_addr;//初始化IO基地址 ndev->irq = db->irq_res->start; //初始化irq
/**根据DM9000的数据位宽,初始化读写数据帧的函数指针初始化net_device给其结构中的成员变量和成员函数赋值*/ /* ensure at least we have a default set of IO routines */ dm9000_set_io(db, iosize); /*根据platform的定义(16bit),再次初始化读写数据帧的函数指针*/ /* check to see if anything is being over-ridden */ if (pdata != NULL) { /* check to see if the driver wants to over-ride the * default IO width */ /****IOctl flag在驱动加载的时候被传入********/ if (pdata->flags & DM9000_PLATF_8BITONLY) dm9000_set_io(db, 1);
if (pdata->flags & DM9000_PLATF_16BITONLY) dm9000_set_io(db, 2);
if (pdata->flags & DM9000_PLATF_32BITONLY) dm9000_set_io(db, 4);
/* check to see if there are any IO routine * over-rides */ /*检查看看是否有任何IO常规越权*/ if (pdata->inblk != NULL) db->inblk = pdata->inblk;
if (pdata->outblk != NULL) db->outblk = pdata->outblk;
if (pdata->dumpblk != NULL) db->dumpblk = pdata->dumpblk;
db->flags = pdata->flags; }
/ |