Update to use newbus and busspace.
This commit is contained in:
parent
f20dd05a67
commit
20e1658bc2
271
sys/pci/ncr.c
271
sys/pci/ncr.c
@ -180,8 +180,12 @@
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/bus.h>
|
||||
#include <machine/clock.h>
|
||||
#include <machine/md_var.h>
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
#include <sys/rman.h>
|
||||
#include <vm/vm.h>
|
||||
#include <vm/pmap.h>
|
||||
#include <vm/vm_extern.h>
|
||||
@ -281,27 +285,33 @@
|
||||
#define vtophys(va) alpha_XXX_dmamap((vm_offset_t)va)
|
||||
#endif
|
||||
|
||||
#ifdef NCR_IOMAPPED
|
||||
#define INB(r) bus_space_read_1(np->bst, np->bsh, offsetof(struct ncr_reg, r))
|
||||
#define INW(r) bus_space_read_2(np->bst, np->bsh, offsetof(struct ncr_reg, r))
|
||||
#define INL(r) bus_space_read_4(np->bst, np->bsh, offsetof(struct ncr_reg, r))
|
||||
|
||||
#define INB(r) inb (np->port + offsetof(struct ncr_reg, r))
|
||||
#define INW(r) inw (np->port + offsetof(struct ncr_reg, r))
|
||||
#define INL(r) inl (np->port + offsetof(struct ncr_reg, r))
|
||||
#define OUTB(r, val) bus_space_write_1(np->bst, np->bsh, \
|
||||
offsetof(struct ncr_reg, r), val)
|
||||
#define OUTW(r, val) bus_space_write_2(np->bst, np->bsh, \
|
||||
offsetof(struct ncr_reg, r), val)
|
||||
#define OUTL(r, val) bus_space_write_4(np->bst, np->bsh, \
|
||||
offsetof(struct ncr_reg, r), val)
|
||||
#define OUTL_OFF(o, val) bus_space_write_4(np->bst, np->bsh, o, val)
|
||||
|
||||
#define OUTB(r, val) outb (np->port+offsetof(struct ncr_reg,r),(val))
|
||||
#define OUTW(r, val) outw (np->port+offsetof(struct ncr_reg,r),(val))
|
||||
#define OUTL(r, val) outl (np->port+offsetof(struct ncr_reg,r),(val))
|
||||
#define OUTL_OFF(o, val) outl(np->port + (o), (val))
|
||||
#define INB_OFF(o) bus_space_read_1(np->bst, np->bsh, o)
|
||||
#define INW_OFF(o) bus_space_read_2(np->bst, np->bsh, o)
|
||||
#define INL_OFF(o) bus_space_read_4(np->bst, np->bsh, o)
|
||||
|
||||
#define INB_OFF(o) inb (np->port + (o))
|
||||
#define INW_OFF(o) inw (np->port + (o))
|
||||
#define INL_OFF(o) inl (np->port + (o))
|
||||
#define READSCRIPT_OFF(base, off) \
|
||||
(base ? *((volatile u_int32_t *)((volatile char *)base + (off))) : \
|
||||
bus_space_read_4(np->bst2, np->bsh2, off))
|
||||
|
||||
#define READSCRIPT_OFF(base, off) \
|
||||
(*((u_int32_t *)((char *)base + (off))))
|
||||
|
||||
#define WRITESCRIPT_OFF(base, off, val) \
|
||||
do { \
|
||||
*((u_int32_t *)((char *)base + (off))) = (val); \
|
||||
#define WRITESCRIPT_OFF(base, off, val) \
|
||||
do { \
|
||||
if (base) \
|
||||
*((volatile u_int32_t *) \
|
||||
((volatile char *)base + (off))) = (val); \
|
||||
else \
|
||||
bus_space_write_4(np->bst2, np->bsh2, off, val); \
|
||||
} while (0)
|
||||
|
||||
#define READSCRIPT(r) \
|
||||
@ -310,65 +320,6 @@
|
||||
#define WRITESCRIPT(r, val) \
|
||||
WRITESCRIPT_OFF(np->script, offsetof(struct script, r), val)
|
||||
|
||||
#else
|
||||
|
||||
#ifdef __alpha__
|
||||
|
||||
#define INB(r) readb (np->vaddr + offsetof(struct ncr_reg, r))
|
||||
#define INW(r) readw (np->vaddr + offsetof(struct ncr_reg, r))
|
||||
#define INL(r) readl (np->vaddr + offsetof(struct ncr_reg, r))
|
||||
|
||||
#define OUTB(r, val) writeb (np->vaddr+offsetof(struct ncr_reg,r),(val))
|
||||
#define OUTW(r, val) writew (np->vaddr+offsetof(struct ncr_reg,r),(val))
|
||||
#define OUTL(r, val) writel (np->vaddr+offsetof(struct ncr_reg,r),(val))
|
||||
#define OUTL_OFF(o, val) writel (np->vaddr + (o), (val))
|
||||
|
||||
#define INB_OFF(o) readb (np->vaddr + (o))
|
||||
#define INW_OFF(o) readw (np->vaddr + (o))
|
||||
#define INL_OFF(o) readl (np->vaddr + (o))
|
||||
|
||||
#define READSCRIPT_OFF(base, off) \
|
||||
(base ? *((u_int32_t *)((char *)base + (off))) : \
|
||||
readl(np->vaddr2 + off))
|
||||
|
||||
#define WRITESCRIPT_OFF(base, off, val) \
|
||||
do { \
|
||||
if (base) \
|
||||
*((u_int32_t *)((char *)base + (off))) = (val); \
|
||||
else \
|
||||
writel(np->vaddr2 + off, val); \
|
||||
} while (0)
|
||||
|
||||
#define READSCRIPT(r) \
|
||||
READSCRIPT_OFF(np->script, offsetof(struct script, r))
|
||||
|
||||
#define WRITESCRIPT(r, val) \
|
||||
WRITESCRIPT_OFF(np->script, offsetof(struct script, r), val)
|
||||
|
||||
#else
|
||||
|
||||
#define INB(r) (np->reg->r)
|
||||
#define INW(r) (np->reg->r)
|
||||
#define INL(r) (np->reg->r)
|
||||
|
||||
#define OUTB(r, val) np->reg->r = (val)
|
||||
#define OUTW(r, val) np->reg->r = (val)
|
||||
#define OUTL(r, val) np->reg->r = (val)
|
||||
#define OUTL_OFF(o, val) *(u_int32_t *) (((u_char *) np->reg) + (o)) = (val)
|
||||
|
||||
#define INB_OFF(o) *( ((u_char *) np->reg) + (o) )
|
||||
#define INW_OFF(o) *((u_short *) ( ((u_char *) np->reg) + (o)) )
|
||||
#define INL_OFF(o) *((u_int32_t *) ( ((u_char *) np->reg) + (o)) )
|
||||
|
||||
#define READSCRIPT_OFF(base, off) (*((volatile u_int32_t *)((char *)base + (off))))
|
||||
#define WRITESCRIPT_OFF(base, off, val) (*((volatile u_int32_t *)((char *)base + (off))) = (val))
|
||||
#define READSCRIPT(r) (np->script->r)
|
||||
#define WRITESCRIPT(r, val) np->script->r = (val)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Set bit field ON, OFF
|
||||
*/
|
||||
@ -1057,19 +1008,18 @@ struct ncb {
|
||||
** virtual and physical addresses
|
||||
** of the 53c810 chip.
|
||||
*/
|
||||
vm_offset_t vaddr;
|
||||
vm_offset_t paddr;
|
||||
int reg_rid;
|
||||
struct resource *reg_res;
|
||||
bus_space_tag_t bst;
|
||||
bus_space_handle_t bsh;
|
||||
|
||||
vm_offset_t vaddr2;
|
||||
vm_offset_t paddr2;
|
||||
int sram_rid;
|
||||
struct resource *sram_res;
|
||||
bus_space_tag_t bst2;
|
||||
bus_space_handle_t bsh2;
|
||||
|
||||
/*
|
||||
** pointer to the chip's registers.
|
||||
*/
|
||||
volatile
|
||||
#ifdef __i386__
|
||||
struct ncr_reg* reg;
|
||||
#endif
|
||||
struct resource *irq_res;
|
||||
void *irq_handle;
|
||||
|
||||
/*
|
||||
** Scripts instance virtual address.
|
||||
@ -1346,8 +1296,8 @@ static void ncr_action (struct cam_sim *sim, union ccb *ccb);
|
||||
static void ncr_timeout (void *arg);
|
||||
static void ncr_wakeup (ncb_p np, u_long code);
|
||||
|
||||
static const char* ncr_probe (pcici_t tag, pcidi_t type);
|
||||
static void ncr_attach (pcici_t tag, int unit);
|
||||
static int ncr_probe (device_t dev);
|
||||
static int ncr_attach (device_t dev);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
@ -1373,8 +1323,6 @@ static const u_long ncr_version = NCR_VERSION * 11
|
||||
+ (u_long) sizeof (struct tcb) * 2;
|
||||
|
||||
#ifdef _KERNEL
|
||||
static const int nncr=MAX_UNITS; /* XXX to be replaced by SYSCTL */
|
||||
static ncb_p ncrp [MAX_UNITS]; /* XXX to be replaced by SYSCTL */
|
||||
|
||||
static int ncr_debug = SCSI_NCR_DEBUG;
|
||||
SYSCTL_INT(_debug, OID_AUTO, ncr_debug, CTLFLAG_RW, &ncr_debug, 0, "");
|
||||
@ -1404,18 +1352,6 @@ static int ncr_cache; /* to be aligned _NOT_ static */
|
||||
#define NCR_1510D_ID (0x000a1000ul)
|
||||
|
||||
|
||||
static u_long ncr_count;
|
||||
|
||||
static struct pci_device ncr_device = {
|
||||
"ncr",
|
||||
ncr_probe,
|
||||
ncr_attach,
|
||||
&ncr_count,
|
||||
NULL
|
||||
};
|
||||
|
||||
COMPAT_PCI_DRIVER (ncr, ncr_device);
|
||||
|
||||
static char *ncr_name (ncb_p np)
|
||||
{
|
||||
static char name[10];
|
||||
@ -3173,7 +3109,7 @@ static void ncr_script_copy_and_bind (ncb_p np, ncrcmd *src, ncrcmd *dst, int le
|
||||
|
||||
switch (old & RELOC_MASK) {
|
||||
case RELOC_REGISTER:
|
||||
new = (old & ~RELOC_MASK) + np->paddr;
|
||||
new = (old & ~RELOC_MASK) + rman_get_start(np->reg_res);
|
||||
break;
|
||||
case RELOC_LABEL:
|
||||
new = (old & ~RELOC_MASK) + np->p_script;
|
||||
@ -3355,16 +3291,17 @@ static int ncr_chip_lookup(u_long device_id, u_char revision_id)
|
||||
|
||||
|
||||
|
||||
static const char* ncr_probe (pcici_t tag, pcidi_t type)
|
||||
static int ncr_probe (device_t dev)
|
||||
{
|
||||
u_char rev = pci_conf_read (tag, PCI_CLASS_REG) & 0xff;
|
||||
int i;
|
||||
|
||||
i = ncr_chip_lookup(type, rev);
|
||||
if (i >= 0)
|
||||
return ncr_chip_table[i].name;
|
||||
i = ncr_chip_lookup(pci_get_devid(dev), pci_get_revid(dev));
|
||||
if (i >= 0) {
|
||||
device_set_desc(dev, ncr_chip_table[i].name);
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
|
||||
@ -3433,13 +3370,13 @@ ncr_init_burst(ncb_p np, u_char bc)
|
||||
*/
|
||||
|
||||
|
||||
static void
|
||||
ncr_attach (pcici_t config_id, int unit)
|
||||
static int
|
||||
ncr_attach (device_t dev)
|
||||
{
|
||||
ncb_p np = (struct ncb*) 0;
|
||||
ncb_p np = (struct ncb*) device_get_softc(dev);
|
||||
u_char rev = 0;
|
||||
u_long period;
|
||||
int i;
|
||||
int i, rid;
|
||||
u_int8_t usrsync;
|
||||
u_int8_t usrwide;
|
||||
struct cam_devq *devq;
|
||||
@ -3448,20 +3385,20 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
** allocate and initialize structures.
|
||||
*/
|
||||
|
||||
np = (ncb_p) malloc (sizeof (struct ncb), M_DEVBUF, M_NOWAIT);
|
||||
if (!np) return;
|
||||
ncrp[unit]=np;
|
||||
bzero (np, sizeof (*np));
|
||||
|
||||
np->unit = unit;
|
||||
np->unit = device_get_unit(dev);
|
||||
|
||||
/*
|
||||
** Try to map the controller chip to
|
||||
** virtual and physical memory.
|
||||
*/
|
||||
|
||||
if (!pci_map_mem (config_id, 0x14, &np->vaddr, &np->paddr))
|
||||
return;
|
||||
np->reg_rid = 0x14;
|
||||
np->reg_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &np->reg_rid,
|
||||
0, ~0, 1, RF_ACTIVE);
|
||||
if (!np->reg_res) {
|
||||
device_printf(dev, "could not map memory\n");
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
/*
|
||||
** Make the controller's registers available.
|
||||
@ -3469,9 +3406,9 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
** can be used safely.
|
||||
*/
|
||||
|
||||
#ifdef __i386__
|
||||
np->reg = (struct ncr_reg*) np->vaddr;
|
||||
#endif
|
||||
np->bst = rman_get_bustag(np->reg_res);
|
||||
np->bsh = rman_get_bushandle(np->reg_res);
|
||||
|
||||
|
||||
#ifdef NCR_IOMAPPED
|
||||
/*
|
||||
@ -3509,12 +3446,12 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
** Do chip dependent initialization.
|
||||
*/
|
||||
|
||||
rev = pci_conf_read (config_id, PCI_CLASS_REG) & 0xff;
|
||||
rev = pci_get_revid(dev);
|
||||
|
||||
/*
|
||||
** Get chip features from chips table.
|
||||
*/
|
||||
i = ncr_chip_lookup(pci_conf_read(config_id, PCI_ID_REG), rev);
|
||||
i = ncr_chip_lookup(pci_get_devid(dev), rev);
|
||||
|
||||
if (i >= 0) {
|
||||
np->maxburst = ncr_chip_table[i].maxburst;
|
||||
@ -3648,24 +3585,24 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
burst_code(np->rv_dmode, np->rv_ctest4, np->rv_ctest5);
|
||||
}
|
||||
|
||||
#ifndef NCR_IOMAPPED
|
||||
/*
|
||||
** Get on-chip SRAM address, if supported
|
||||
*/
|
||||
if ((np->features & FE_RAM) && sizeof(struct script) <= 4096)
|
||||
(void)(!pci_map_mem (config_id,0x18, &np->vaddr2, &np->paddr2));
|
||||
#endif /* !NCR_IOMAPPED */
|
||||
if ((np->features & FE_RAM) && sizeof(struct script) <= 4096) {
|
||||
np->sram_rid = 0x18;
|
||||
np->sram_res = bus_alloc_resource(dev, SYS_RES_MEMORY,
|
||||
&np->sram_rid,
|
||||
0, ~0, 1, RF_ACTIVE);
|
||||
}
|
||||
|
||||
/*
|
||||
** Allocate structure for script relocation.
|
||||
*/
|
||||
if (np->vaddr2 != NULL) {
|
||||
#ifdef __alpha__
|
||||
if (np->sram_res != NULL) {
|
||||
np->script = NULL;
|
||||
#else
|
||||
np->script = (struct script *) np->vaddr2;
|
||||
#endif
|
||||
np->p_script = np->paddr2;
|
||||
np->p_script = rman_get_start(np->sram_res);
|
||||
np->bst2 = rman_get_bustag(np->sram_res);
|
||||
np->bsh2 = rman_get_bushandle(np->sram_res);
|
||||
} else if (sizeof (struct script) > PAGE_SIZE) {
|
||||
np->script = (struct script*) vm_page_alloc_contig
|
||||
(round_page(sizeof (struct script)),
|
||||
@ -3693,21 +3630,21 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
*/
|
||||
#ifdef PCIR_CACHELNSZ /* To be sure that new PCI stuff is present */
|
||||
{
|
||||
u_char cachelnsz = pci_cfgread(config_id, PCIR_CACHELNSZ, 1);
|
||||
u_short command = pci_cfgread(config_id, PCIR_COMMAND, 2);
|
||||
u_char cachelnsz = pci_read_config(dev, PCIR_CACHELNSZ, 1);
|
||||
u_short command = pci_read_config(dev, PCIR_COMMAND, 2);
|
||||
|
||||
if (!cachelnsz) {
|
||||
cachelnsz = 8;
|
||||
printf("%s: setting PCI cache line size register to %d.\n",
|
||||
ncr_name(np), (int)cachelnsz);
|
||||
pci_cfgwrite(config_id, PCIR_CACHELNSZ, cachelnsz, 1);
|
||||
pci_write_config(dev, PCIR_CACHELNSZ, cachelnsz, 1);
|
||||
}
|
||||
|
||||
if (!(command & (1<<4))) {
|
||||
command |= (1<<4);
|
||||
printf("%s: setting PCI command write and invalidate.\n",
|
||||
ncr_name(np));
|
||||
pci_cfgwrite(config_id, PCIR_COMMAND, command, 2);
|
||||
pci_write_config(dev, PCIR_COMMAND, command, 2);
|
||||
}
|
||||
}
|
||||
#endif /* PCIR_CACHELNSZ */
|
||||
@ -3756,7 +3693,7 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
ncr_name(np),
|
||||
np->rv_stest2 & 0x20 ? "differential" : "single-ended",
|
||||
np->rv_dcntl & IRQM ? "totem pole" : "open drain",
|
||||
np->vaddr2 ? ", using on-chip SRAM" : "");
|
||||
np->sram_res ? ", using on-chip SRAM" : "");
|
||||
|
||||
/*
|
||||
** Patch scripts to physical addresses
|
||||
@ -3826,15 +3763,23 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
|
||||
if (ncr_snooptest (np)) {
|
||||
printf ("CACHE INCORRECTLY CONFIGURED.\n");
|
||||
return;
|
||||
return EINVAL;
|
||||
};
|
||||
|
||||
/*
|
||||
** Install the interrupt handler.
|
||||
*/
|
||||
|
||||
if (!pci_map_int (config_id, ncr_intr, np, &cam_imask))
|
||||
printf ("\tinterruptless mode: reduced performance.\n");
|
||||
rid = 0;
|
||||
np->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
|
||||
RF_SHAREABLE | RF_ACTIVE);
|
||||
if (np->irq_res == NULL) {
|
||||
device_printf(dev,
|
||||
"interruptless mode: reduced performance.\n");
|
||||
} else {
|
||||
bus_setup_intr(dev, np->irq_res, INTR_TYPE_CAM,
|
||||
ncr_intr, np, &np->irq_handle);
|
||||
}
|
||||
|
||||
/*
|
||||
** Create the device queue. We only allow MAX_START-1 concurrent
|
||||
@ -3843,7 +3788,7 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
*/
|
||||
devq = cam_simq_alloc(MAX_START - 1);
|
||||
if (devq == NULL)
|
||||
return;
|
||||
return ENOMEM;
|
||||
|
||||
/*
|
||||
** Now tell the generic SCSI layer
|
||||
@ -3853,13 +3798,13 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
1, MAX_TAGS, devq);
|
||||
if (np->sim == NULL) {
|
||||
cam_simq_free(devq);
|
||||
return;
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
if (xpt_bus_register(np->sim, 0) != CAM_SUCCESS) {
|
||||
cam_sim_free(np->sim, /*free_devq*/ TRUE);
|
||||
return;
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
if (xpt_create_path(&np->path, /*periph*/NULL,
|
||||
@ -3867,7 +3812,7 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
|
||||
xpt_bus_deregister(cam_sim_path(np->sim));
|
||||
cam_sim_free(np->sim, /*free_devq*/TRUE);
|
||||
return;
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3876,7 +3821,7 @@ ncr_attach (pcici_t config_id, int unit)
|
||||
ncr_timeout (np);
|
||||
np->lasttime=0;
|
||||
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================================
|
||||
@ -5596,7 +5541,7 @@ void ncr_exception (ncb_p np)
|
||||
printf (" ");
|
||||
break;
|
||||
};
|
||||
val = ((unsigned char*) np->vaddr) [i];
|
||||
val = bus_space_read_1(np->bst, np->bsh, i);
|
||||
printf (" %x%x", val/16, val%16);
|
||||
if (i%16==15) printf (".\n");
|
||||
};
|
||||
@ -5799,7 +5744,7 @@ static void ncr_int_ma (ncb_p np, u_char dstat)
|
||||
printf ("\nCP=%p CP2=%p DSP=%x NXT=%x VDSP=%p CMD=%x ",
|
||||
cp, np->header.cp,
|
||||
dsp,
|
||||
nxtdsp, (char*)vdsp_base+vdsp_off, cmd);
|
||||
nxtdsp, (volatile char*)vdsp_base+vdsp_off, cmd);
|
||||
};
|
||||
|
||||
/*
|
||||
@ -6566,11 +6511,11 @@ ncr_alloc_nccb (ncb_p np, u_long target, u_long lun)
|
||||
tp->getscr[0] =
|
||||
(np->features & FE_PFEN)? SCR_COPY(1) : SCR_COPY_F(1);
|
||||
tp->getscr[1] = vtophys (&tp->tinfo.sval);
|
||||
tp->getscr[2] = np->paddr + offsetof (struct ncr_reg, nc_sxfer);
|
||||
tp->getscr[2] = rman_get_start(np->reg_res) + offsetof (struct ncr_reg, nc_sxfer);
|
||||
tp->getscr[3] =
|
||||
(np->features & FE_PFEN)? SCR_COPY(1) : SCR_COPY_F(1);
|
||||
tp->getscr[4] = vtophys (&tp->tinfo.wval);
|
||||
tp->getscr[5] = np->paddr + offsetof (struct ncr_reg, nc_scntl3);
|
||||
tp->getscr[5] = rman_get_start(np->reg_res) + offsetof (struct ncr_reg, nc_scntl3);
|
||||
|
||||
assert (((offsetof(struct ncr_reg, nc_sxfer) ^
|
||||
(offsetof(struct tcb ,tinfo)
|
||||
@ -7208,5 +7153,23 @@ printf ("Sum = %04x\n", sum);
|
||||
}
|
||||
#endif /* NCR_TEKRAM_EEPROM */
|
||||
|
||||
static device_method_t ncr_methods[] = {
|
||||
/* Device interface */
|
||||
DEVMETHOD(device_probe, ncr_probe),
|
||||
DEVMETHOD(device_attach, ncr_attach),
|
||||
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static driver_t ncr_driver = {
|
||||
"ncr",
|
||||
ncr_methods,
|
||||
sizeof(struct ncb),
|
||||
};
|
||||
|
||||
static devclass_t ncr_devclass;
|
||||
|
||||
DRIVER_MODULE(if_ncr, pci, ncr_driver, ncr_devclass, 0, 0);
|
||||
|
||||
/*=========================================================================*/
|
||||
#endif /* _KERNEL */
|
||||
|
Loading…
Reference in New Issue
Block a user