Andrew Athan
2005-Feb-06 22:38 UTC
[Asterisk-Users] Intel 537EP is NOT the MD3200 aka X100P [Re: Intel 537EP chipset, revisited]
It seems the information out there on this topic was confusing enough to cause me to waste a lot of time, and that this topic is rehashed periodically. So now it's my turn.... I had a modem with an Intel 537EP chip on it and thought it might work with the zaptel drivers. Initially, it seemed the only issue would be the PCI device & vendor codes. Then, I ran into the problem that the serial driver claimed the device, disallowing the zaptel wcfxo driver to grab it. The following patches fix those problems, BUT, further investigation reveals this card is not compatible. It's not clear how different the 537EP is from teh MD3200 / X100P; might be worth checking into. http://linmodems.technion.ac.il/packages/Intel/537/ is Intel's site containing linux modem drivers for the 537 line, and these appear to include voice features. Not sure if duplex and if compatible with Asterisk voicemodem driver. Again, might be worth checking into. In the meantime, make sure you purchase the X100P or MD3200 ! *** wcfxo.c 2005-01-15 17:59:18.000000000 -0500 --- wcfxo.c.new 2005-02-06 22:47:06.343556005 -0500 *************** *** 980,985 **** --- 980,986 ---- { 0xe159, 0x0001, 0x8086, PCI_ANY_ID, 0, 0, (unsigned long) &generic }, { 0xe159, 0x0001, 0x8087, PCI_ANY_ID, 0, 0, (unsigned long) &generic }, { 0x1057, 0x5608, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (unsigned long) &wcx100p }, + { 0x8086, 0x1080, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (unsigned long) &generic }, { 0 } }; *************** *** 1000,1005 **** --- 1001,1048 ---- { int res; int x; + + + struct pci_dev *pdev; + int i; + + /* workaround for serial driver falsely claiming to handle our devices. */ + for(i=0; wcfxo_pci_tbl[i].vendor; i++) { + pdev = NULL; + while( (pdev = pci_find_device(wcfxo_pci_tbl[i].vendor, wcfxo_pci_tbl[i].device, pdev)) ) { + if ((((pdev->class >> 8) != PCI_CLASS_COMMUNICATION_SERIAL) && + ((pdev->class >> 8) != PCI_CLASS_COMMUNICATION_MODEM)) || + (pdev->class & 0xff) > 6) + continue; + + if(pdev->driver) { + if(pdev->driver->name && !strcmp(pdev->driver->name, "serial")) { + printk(KERN_WARNING"wcfxo: %s driver grabbed our device (%s), reclaiming it..\n", pdev->driver->name, pdev->slot_name); + #if ( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) + { + struct device *dev = get_device(&pdev->dev); + + if(dev) { + device_release_driver(dev); + put_device(dev); + } + } + #else + if(pdev->driver) { + if(pdev->driver->remove) { + pdev->driver->remove(pdev); + } + pdev->driver = NULL; + } + #endif + + } + } + } + } + + + if ((opermode >= sizeof(fxo_modes) / sizeof(fxo_modes[0])) || (opermode < 0)) { printk("Invalid/unknown operating mode specified. Please choose one of:\n"); for (x=0;x<sizeof(fxo_modes) / sizeof(fxo_modes[0]); x++)