8139too.c (1)
色々穿りマワしてみるってコトで。とりあえず簡単な例ってコトで rtl8139_chip_reset 手続きの定義をマクロで置換してみる。
元は以下。
static void rtl8139_chip_reset (void *ioaddr) { int i; /* Soft reset the chip. */ RTL_W8 (ChipCmd, CmdReset); /* Check that the chip has finished the reset. */ for (i = 1000; i > 0; i--) { barrier(); if ((RTL_R8 (ChipCmd) & CmdReset) == 0) break; udelay (10); } }
RTL_W8 マクロと RTL_R8 マクロを置き換えてみます。とりあえず 2.6.33 なカーネルだとこれらのマクロは以下の定義なので
/* write MMIO register */ #define RTL_W8(reg, val8) iowrite8 ((val8), ioaddr + (reg)) #define RTL_W16(reg, val16) iowrite16 ((val16), ioaddr + (reg)) #define RTL_W32(reg, val32) iowrite32 ((val32), ioaddr + (reg)) /* read MMIO register */ #define RTL_R8(reg) ioread8 (ioaddr + (reg)) #define RTL_R16(reg) ioread16 (ioaddr + (reg)) #define RTL_R32(reg) ((unsigned long) ioread32 (ioaddr + (reg)))
こうなるのかな。
static void rtl8139_chip_reset (void *ioaddr) { int i; /* Soft reset the chip. */ RTL_W8 (ChipCmd, CmdReset); /* Check that the chip has finished the reset. */ for (i = 1000; i > 0; i--) { barrier(); if ((RTL_R8 (ChipCmd) & CmdReset) == 0) break; udelay (10); } }
2.6.33 なドライバだと以下に置き換えれるか。
static void rtl8139_chip_reset (void *ioaddr) { int i; /* Soft reset the chip. */ iowrite8 ((CmdReset), ioaddr + (ChipCmd)); /* Check that the chip has finished the reset. */ for (i = 1000; i > 0; i--) { barrier(); if ((ioread8 (ioaddr + (ChipCmd))) == 0) break; udelay (10); } }
で、何だっけ、と直前エントリを見たら条件分岐の意図云々な記述を発見。
if (use_io) { ioaddr = pci_iomap(pdev, 0, 0); if (!ioaddr) { dev_err(&pdev->dev, "cannot map PIO, aborting\n"); rc = -EIO; goto err_out; } dev->base_addr = pio_start; tp->regs_len = pio_len; } else { /* ioremap MMIO region */ ioaddr = pci_iomap(pdev, 1, 0);
use_io って上らへんで以下な定義?
module_param(use_io, int, 0); MODULE_PARM_DESC(use_io, "Force use of I/O access mode. 0=MMIO 1=PIO");
module_param マクロですが、include/linux/moduleparam.h にて以下な定義。
/* Helper functions: type is byte, short, ushort, int, uint, long, ulong, charp, bool or invbool, or XXX if you define param_get_XXX, param_set_XXX and param_check_XXX. */ #define module_param_named(name, value, type, perm) \ param_check_##type(name, &(value)); \ module_param_call(name, param_set_##type, param_get_##type, &value, perm); \ __MODULE_PARM_TYPE(name, #type) #define module_param(name, type, perm) \ module_param_named(name, name, type, perm)
このあたりで一旦掘削を停止。