patch-2.4.19 linux-2.4.19/drivers/parport/parport_pc.c
Next file: linux-2.4.19/drivers/parport/parport_serial.c
Previous file: linux-2.4.19/drivers/parport/parport_mfc3.c
Back to the patch index
Back to the overall index
- Lines: 216
- Date:
Fri Aug 2 17:39:44 2002
- Orig file:
linux-2.4.18/drivers/parport/parport_pc.c
- Orig date:
Mon Feb 25 11:38:03 2002
diff -urN linux-2.4.18/drivers/parport/parport_pc.c linux-2.4.19/drivers/parport/parport_pc.c
@@ -821,8 +821,9 @@
long int expire;
const struct parport_pc_private *priv = port->physport->private_data;
- /* Special case: a timeout of zero means we cannot call schedule(). */
- if (!port->physport->cad->timeout)
+ /* Special case: a timeout of zero means we cannot call schedule().
+ * Also if O_NONBLOCK is set then use the default implementation. */
+ if (port->physport->cad->timeout <= PARPORT_INACTIVITY_O_NONBLOCK)
return parport_ieee1284_write_compat (port, buf,
length, flags);
@@ -897,8 +898,9 @@
long int expire;
const struct parport_pc_private *priv = port->physport->private_data;
- /* Special case: a timeout of zero means we cannot call schedule(). */
- if (!port->physport->cad->timeout)
+ /* Special case: a timeout of zero means we cannot call schedule().
+ * Also if O_NONBLOCK is set then use the default implementation. */
+ if (port->physport->cad->timeout <= PARPORT_INACTIVITY_O_NONBLOCK)
return parport_ieee1284_ecp_write_data (port, buf,
length, flags);
@@ -1017,8 +1019,9 @@
DPRINTK (KERN_DEBUG "parport_pc: parport_pc_ecp_read_block_pio\n");
dump_parport_state ("enter fcn", port);
- /* Special case: a timeout of zero means we cannot call schedule(). */
- if (!port->cad->timeout)
+ /* Special case: a timeout of zero means we cannot call schedule().
+ * Also if O_NONBLOCK is set then use the default implementation. */
+ if (port->cad->timeout <= PARPORT_INACTIVITY_O_NONBLOCK)
return parport_ieee1284_ecp_read_data (port, buf,
length, flags);
@@ -2139,8 +2142,6 @@
{
struct parport_pc_private *priv = pb->private_data;
- priv->ctr_writable |= 0x10;
-
if (priv->ecr) {
pb->irq = programmable_irq_support(pb);
@@ -2165,9 +2166,6 @@
if (pb->irq == PARPORT_IRQ_NONE)
pb->irq = get_superio_irq(pb);
- if (pb->irq == PARPORT_IRQ_NONE)
- priv->ctr_writable &= ~0x10;
-
return pb->irq;
}
@@ -2296,6 +2294,7 @@
}
if (p->irq != PARPORT_IRQ_NONE) {
printk(", irq %d", p->irq);
+ priv->ctr_writable |= 0x10;
if (p->dma == PARPORT_DMA_AUTO) {
p->dma = PARPORT_DMA_NONE;
@@ -2654,25 +2653,10 @@
enum parport_pc_pci_cards {
- siig_1s1p_10x_550 = last_sio,
- siig_1s1p_10x_650,
- siig_1s1p_10x_850,
- siig_1p_10x,
+ siig_1p_10x = last_sio,
siig_2p_10x,
- siig_2s1p_10x_550,
- siig_2s1p_10x_650,
- siig_2s1p_10x_850,
siig_1p_20x,
siig_2p_20x,
- siig_2p1s_20x_550,
- siig_2p1s_20x_650,
- siig_2p1s_20x_850,
- siig_1s1p_20x_550,
- siig_1s1p_20x_650,
- siig_1s1p_20x_850,
- siig_2s1p_20x_550,
- siig_2s1p_20x_650,
- siig_2s1p_20x_850,
lava_parallel,
lava_parallel_dual_a,
lava_parallel_dual_b,
@@ -2710,6 +2694,7 @@
oxsemi_954,
oxsemi_840,
aks_0100,
+ mobility_pp,
};
@@ -2723,26 +2708,20 @@
int hi; /* -1 if not there, >6 for offset-method (max
BAR is 6) */
} addr[4];
+
+ /* If set, this is called immediately after pci_enable_device.
+ * If it returns non-zero, no probing will take place and the
+ * ports will not be used. */
+ int (*preinit_hook) (struct pci_dev *pdev, int autoirq, int autodma);
+
+ /* If set, this is called after probing for ports. If 'failed'
+ * is non-zero we couldn't use any of the ports. */
+ void (*postinit_hook) (struct pci_dev *pdev, int failed);
} cards[] __devinitdata = {
- /* siig_1s1p_10x_550 */ { 1, { { 3, 4 }, } },
- /* siig_1s1p_10x_650 */ { 1, { { 3, 4 }, } },
- /* siig_1s1p_10x_850 */ { 1, { { 3, 4 }, } },
/* siig_1p_10x */ { 1, { { 2, 3 }, } },
/* siig_2p_10x */ { 2, { { 2, 3 }, { 4, 5 }, } },
- /* siig_2s1p_10x_550 */ { 1, { { 4, 5 }, } },
- /* siig_2s1p_10x_650 */ { 1, { { 4, 5 }, } },
- /* siig_2s1p_10x_850 */ { 1, { { 4, 5 }, } },
/* siig_1p_20x */ { 1, { { 0, 1 }, } },
/* siig_2p_20x */ { 2, { { 0, 1 }, { 2, 3 }, } },
- /* siig_2p1s_20x_550 */ { 2, { { 1, 2 }, { 3, 4 }, } },
- /* siig_2p1s_20x_650 */ { 2, { { 1, 2 }, { 3, 4 }, } },
- /* siig_2p1s_20x_850 */ { 2, { { 1, 2 }, { 3, 4 }, } },
- /* siig_1s1p_20x_550 */ { 1, { { 1, 2 }, } },
- /* siig_1s1p_20x_650 */ { 1, { { 1, 2 }, } },
- /* siig_1s1p_20x_850 */ { 1, { { 1, 2 }, } },
- /* siig_2s1p_20x_550 */ { 1, { { 2, 3 }, } },
- /* siig_2s1p_20x_650 */ { 1, { { 2, 3 }, } },
- /* siig_2s1p_20x_850 */ { 1, { { 2, 3 }, } },
/* lava_parallel */ { 1, { { 0, -1 }, } },
/* lava_parallel_dual_a */ { 1, { { 0, -1 }, } },
/* lava_parallel_dual_b */ { 1, { { 0, -1 }, } },
@@ -2784,6 +2763,7 @@
/* oxsemi_954 */ { 1, { { 0, -1 }, } },
/* oxsemi_840 */ { 1, { { 0, -1 }, } },
/* aks_0100 */ { 1, { { 0, 1 }, } },
+ /* mobility_pp */ { 1, { { 0, 1 }, } },
};
static struct pci_device_id parport_pc_pci_tbl[] __devinitdata = {
@@ -2793,44 +2773,14 @@
PCI_ANY_ID, PCI_ANY_ID, 0, 0, sio_ite_8872 },
/* PCI cards */
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x_550 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x_650 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_10x_850 },
{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_10x,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1p_10x },
{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_10x,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p_10x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x_550 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x_650 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_10x_850 },
{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_20x,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1p_20x },
{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_20x,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p_20x },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x_550 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x_650 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2p1s_20x_850 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x_550 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x_650 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_1s1p_20x_850 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x_550 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x_650 },
- { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x_850 },
{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PARALLEL,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, lava_parallel },
{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_A,
@@ -2865,6 +2815,7 @@
{ 0x1409, 0x7268, 0x1409, 0x0103, 0, 0, timedia_4008a },
{ 0x1409, 0x7268, 0x1409, 0x0104, 0, 0, timedia_4018 },
{ 0x1409, 0x7268, 0x1409, 0x9018, 0, 0, timedia_9018a },
+ { 0x14f2, 0x0121, PCI_ANY_ID, PCI_ANY_ID, 0, 0, mobility_pp },
{ PCI_VENDOR_ID_SYBA, PCI_DEVICE_ID_SYBA_2P_EPP,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, syba_2p_epp },
{ PCI_VENDOR_ID_SYBA, PCI_DEVICE_ID_SYBA_1P_ECP,
@@ -2899,6 +2850,10 @@
if ((err = pci_enable_device (dev)) != 0)
return err;
+ if (cards[i].preinit_hook &&
+ cards[i].preinit_hook (dev, PARPORT_IRQ_NONE, PARPORT_DMA_NONE))
+ return -ENODEV;
+
for (n = 0; n < cards[i].numports; n++) {
int lo = cards[i].addr[n].lo;
int hi = cards[i].addr[n].hi;
@@ -2921,6 +2876,9 @@
count++;
}
+ if (cards[i].postinit_hook)
+ cards[i].postinit_hook (dev, count == 0);
+
return count == 0 ? -ENODEV : 0;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)