diff -u ltmodem.orig/Makefile ltmodem/Makefile --- ltmodem.orig/Makefile 2009-04-20 05:04:59.000000000 +0000 +++ ltmodem/Makefile 2010-01-04 21:03:39.000000000 +0000 @@ -13,6 +13,7 @@ all: modules modules: + echo > .ltmdmobj.o_.cmd $(MAKE) -C $(KBUILD_DIR) M="$(MSRC_DIR)" modules install: diff -u ltmodem.orig/lib.c ltmodem/lib.c --- ltmodem.orig/lib.c 2008-06-18 13:43:42.000000000 +0000 +++ ltmodem/lib.c 2010-01-04 21:03:35.000000000 +0000 @@ -71,10 +71,10 @@ #define LT_DEFINE_PCI_OP(rw,size,type) \ asmlinkage \ -int lt_pcibios_##rw##_config_##size(unsigned char bus, unsigned char dev_fn, \ +int lt_pcibios_##rw##_config_##size(struct pci_bus *bus, unsigned int dev_fn, \ unsigned char where, unsigned type val) \ { \ - struct pci_dev *pcidev = pci_find_slot(bus, dev_fn); \ + struct pci_dev *pcidev = pci_get_slot(bus, dev_fn); \ if (!pcidev) \ return PCIBIOS_DEVICE_NOT_FOUND; \ return pci_##rw##_config_##size(pcidev, where, val); \ diff -u ltmodem.orig/ltdrv.c ltmodem/ltdrv.c --- ltmodem.orig/ltdrv.c 2008-06-18 19:17:59.000000000 +0000 +++ ltmodem/ltdrv.c 2010-01-04 21:03:41.000000000 +0000 @@ -24,6 +24,7 @@ # define ASSERT(cond, action) do {} while (0) #endif +void dump_core_vars(void); struct martian_metrics { unsigned BaseAddress; @@ -58,7 +59,6 @@ write_vuart_port(offset, value); } -void dump_core_vars(void ); static void serial_startup(struct vuart_host *host) { vxdPortOpen(); @@ -78,16 +78,11 @@ .sleep = NULL }; -static unsigned int init_vport(struct _ltmodem *ltdev) +static unsigned int init_vport(struct vuart_config *conf, struct _ltmodem *ltdev) { - struct vuart_config conf = { - .type = VUART_GENERIC, - .flags = VPF_INTERRUPT - }; - ltdev->host.ops = <_uart_ops; - return serial_v8250_register_port(&conf, <dev->host); + return serial_v8250_register_port(conf, <dev->host); } @@ -95,13 +90,14 @@ static irqreturn_t ltmodem_isr(int irq, void *_dev) { struct _ltmodem *dev = (struct _ltmodem *)_dev; - int handled = 1; spin_lock (&dev->lock); + local_irq_disable(); dp_dsp_isr(); + local_irq_enable(); spin_unlock (&dev->lock); - return IRQ_RETVAL(handled); + return IRQ_HANDLED; } asmlinkage u8 dp_regread(u8 reg) @@ -144,8 +140,9 @@ UART_background(); if (VMODEM_Timer_Active) { - /* conditional ? */ + /* conditional ? struct _ltmodem *ltdev = (struct _ltmodem *)arg; + */ serial_v8250_interrupt(ltmodem.line); } @@ -163,6 +160,7 @@ schedule_delayed_work (<modem.work, HZ/100); } +#ifdef DEBUG #define DUMP_CORE_VAR(var) pr_info("martian: \t" #var "\t= %d\n", var) void dump_core_vars(void ) { @@ -178,6 +176,9 @@ DUMP_CORE_VAR(Irq); DUMP_CORE_VAR(S[0x7e]); } +#else +void dump_core_vars(void) {} +#endif /* DEBUG */ static void init_core(struct martian_metrics *mconf) { @@ -206,6 +207,12 @@ struct _ltmodem *ltmodem_add (struct martian_metrics *metrics, int *error) { struct _ltmodem *dev = <modem; + struct vuart_config vconf = { + .type = VUART_GENERIC, + .flags = VPF_INTERRUPT, + .irq = metrics->irq, + .iobase = metrics->CommAddress + }; int ret; dev->irq = metrics->irq; @@ -217,7 +224,7 @@ ret = request_irq( dev->irq, ltmodem_isr, - IRQF_DISABLED | IRQF_SHARED, + IRQF_SHARED, "ltmodem", dev ); @@ -230,10 +237,9 @@ INIT_DELAYED_WORK(&dev->work, work_func); init_core(metrics); //, dev); - dev->line = init_vport(dev); + dev->line = init_vport(&vconf, dev); - pr_info("martian: added device %x:%x " - "BaseAddress = 0x%x, CommAddres = 0x%x, irq = %d\n", + pr_info("ltmodem: added device %x:%x, base=0x%x, comm=0x%x, irq=%d\n", metrics->vendor, metrics->device, metrics->BaseAddress, metrics->CommAddress, metrics->irq @@ -366,6 +372,11 @@ goto err_disable_pci; } + if (pci_request_regions(dev, "ltmodem")) { + MERROR("failed to register device i/o space\n"); + goto err_disable_pci; + } + pci_set_drvdata (dev, ltdev); selected = 1; @@ -385,6 +396,7 @@ serial_v8250_unregister_port(ltdev->line); free_irq(ltdev->irq, ltdev); } + pci_release_regions(dev); pci_disable_device(dev); } @@ -404,7 +416,6 @@ static int __init ltmodem_init (void) { - pr_info("ltmodem loaded\n"); detach_from_serial(ltmodem_ids); return pci_register_driver (<modem_driver); } diff -u ltmodem.orig/v8250.c ltmodem/v8250.c --- ltmodem.orig/v8250.c 2009-04-20 00:41:24.000000000 +0000 +++ ltmodem/v8250.c 2010-01-04 21:03:40.000000000 +0000 @@ -736,7 +736,7 @@ static struct uart_driver serial8250_reg = { .owner = THIS_MODULE, - .driver_name = "serial", + .driver_name = "vserial", .dev_name = "ttySV", .major = TTY_MAJOR, .minor = 64 + CONFIG_SERIAL_8250_NR_UARTS, @@ -832,9 +832,9 @@ uart->vtype = conf->type; uart->port.iotype = UPIO_PORT; - uart->port.iobase = 0xf0000000; /* imaginary ioport */ + uart->port.iobase = conf->iobase; uart->port.membase = 0; - uart->port.irq = 0; + uart->port.irq = conf->irq; uart->port.mapbase = 0; uart->port.uartclk = 921600 * 16; uart->port.regshift = 0; diff -u ltmodem.orig/v8250.h ltmodem/v8250.h --- ltmodem.orig/v8250.h 2008-06-18 13:43:42.000000000 +0000 +++ ltmodem/v8250.h 2010-01-04 21:03:40.000000000 +0000 @@ -1,6 +1,8 @@ struct vuart_config { unsigned int type; unsigned int flags; + unsigned int irq; + unsigned int iobase; }; struct vuart_host;