Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
3ea7f245
Commit
3ea7f245
authored
Nov 01, 2003
by
Steve French
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux.bkbits.net/linux-2.5
into hostme.bitkeeper.com:/repos/c/cifs/linux-2.5cifs
parents
c85c39e7
3f5ae09d
Changes
39
Hide whitespace changes
Inline
Side-by-side
Showing
39 changed files
with
1491 additions
and
460 deletions
+1491
-460
MAINTAINERS
MAINTAINERS
+1
-1
arch/i386/pci/irq.c
arch/i386/pci/irq.c
+412
-142
crypto/api.c
crypto/api.c
+3
-0
drivers/ide/pci/amd74xx.c
drivers/ide/pci/amd74xx.c
+67
-32
drivers/ide/pci/amd74xx.h
drivers/ide/pci/amd74xx.h
+66
-0
drivers/net/8139cp.c
drivers/net/8139cp.c
+1
-1
drivers/pci/quirks.c
drivers/pci/quirks.c
+24
-2
drivers/scsi/Kconfig
drivers/scsi/Kconfig
+1
-1
drivers/scsi/ata_piix.c
drivers/scsi/ata_piix.c
+6
-0
drivers/scsi/constants.c
drivers/scsi/constants.c
+8
-12
drivers/scsi/libata-core.c
drivers/scsi/libata-core.c
+50
-14
drivers/scsi/osst_options.h
drivers/scsi/osst_options.h
+1
-1
drivers/scsi/sata_promise.c
drivers/scsi/sata_promise.c
+634
-109
drivers/scsi/sata_sil.c
drivers/scsi/sata_sil.c
+2
-0
drivers/scsi/sata_svw.c
drivers/scsi/sata_svw.c
+2
-0
drivers/scsi/sata_via.c
drivers/scsi/sata_via.c
+3
-0
fs/jfs/namei.c
fs/jfs/namei.c
+6
-5
include/asm-sparc/ioctl.h
include/asm-sparc/ioctl.h
+3
-1
include/asm-sparc64/ioctl.h
include/asm-sparc64/ioctl.h
+3
-1
include/linux/libata.h
include/linux/libata.h
+13
-0
include/linux/llc.h
include/linux/llc.h
+4
-7
include/linux/netdevice.h
include/linux/netdevice.h
+2
-0
include/linux/pci_ids.h
include/linux/pci_ids.h
+7
-0
include/linux/sysctl.h
include/linux/sysctl.h
+2
-1
net/appletalk/ddp.c
net/appletalk/ddp.c
+9
-2
net/compat.c
net/compat.c
+5
-10
net/core/dev.c
net/core/dev.c
+26
-0
net/core/skbuff.c
net/core/skbuff.c
+12
-2
net/core/sysctl_net_core.c
net/core/sysctl_net_core.c
+9
-0
net/ipv4/ah4.c
net/ipv4/ah4.c
+3
-0
net/ipv4/ipcomp.c
net/ipv4/ipcomp.c
+6
-1
net/ipv6/ah6.c
net/ipv6/ah6.c
+3
-0
net/ipv6/ipcomp6.c
net/ipv6/ipcomp6.c
+6
-1
net/ipx/af_ipx.c
net/ipx/af_ipx.c
+13
-12
net/llc/af_llc.c
net/llc/af_llc.c
+62
-82
net/llc/llc_conn.c
net/llc/llc_conn.c
+2
-1
net/llc/llc_proc.c
net/llc/llc_proc.c
+8
-13
net/llc/llc_sap.c
net/llc/llc_sap.c
+2
-4
net/socket.c
net/socket.c
+4
-2
No files found.
MAINTAINERS
View file @
3ea7f245
...
...
@@ -1356,7 +1356,7 @@ M: James.Bottomley@HansenPartnership.com
L: linux-scsi@vger.kernel.org
S: Maintained
NETFILTER/IPTABLES
NETFILTER/IPTABLES
/IPCHAINS
P: Rusty Russell
P: Marc Boucher
P: James Morris
...
...
arch/i386/pci/irq.c
View file @
3ea7f245
...
...
@@ -44,6 +44,11 @@ struct irq_router {
int
(
*
set
)(
struct
pci_dev
*
router
,
struct
pci_dev
*
dev
,
int
pirq
,
int
new
);
};
struct
irq_router_handler
{
u16
vendor
;
int
(
*
probe
)(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
);
};
int
(
*
pcibios_enable_irq
)(
struct
pci_dev
*
dev
)
=
NULL
;
/*
...
...
@@ -258,111 +263,220 @@ static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq,
}
/*
* PIRQ routing for SiS 85C503 router used in several SiS chipsets
* According to the SiS 5595 datasheet (preliminary V1.0, 12/24/1997)
* the related registers work as follows:
*
* general: one byte per re-routable IRQ,
* PIRQ routing for SiS 85C503 router used in several SiS chipsets.
* We have to deal with the following issues here:
* - vendors have different ideas about the meaning of link values
* - some onboard devices (integrated in the chipset) have special
* links and are thus routed differently (i.e. not via PCI INTA-INTD)
* - different revision of the router have a different layout for
* the routing registers, particularly for the onchip devices
*
* For all routing registers the common thing is we have one byte
* per routeable link which is defined as:
* bit 7 IRQ mapping enabled (0) or disabled (1)
* bits [6:4] reserved
* bits [6:4] reserved
(sometimes used for onchip devices)
* bits [3:0] IRQ to map to
* allowed: 3-7, 9-12, 14-15
* reserved: 0, 1, 2, 8, 13
*
* individual registers in device config space:
* The config-space registers located at 0x41/0x42/0x43/0x44 are
* always used to route the normal PCI INT A/B/C/D respectively.
* Apparently there are systems implementing PCI routing table using
* link values 0x01-0x04 and others using 0x41-0x44 for PCI INTA..D.
* We try our best to handle both link mappings.
*
* Currently (2003-05-21) it appears most SiS chipsets follow the
* definition of routing registers from the SiS-5595 southbridge.
* According to the SiS 5595 datasheets the revision id's of the
* router (ISA-bridge) should be 0x01 or 0xb0.
*
* 0x41/0x42/0x43/0x44: PCI INT A/B/C/D - bits as in general case
* Furthermore we've also seen lspci dumps with revision 0x00 and 0xb1.
* Looks like these are used in a number of SiS 5xx/6xx/7xx chipsets.
* They seem to work with the current routing code. However there is
* some concern because of the two USB-OHCI HCs (original SiS 5595
* had only one). YMMV.
*
* 0x61: IDEIRQ: bits as in general case - but:
* bits [6:5] must be written 01
* bit 4 channel-select primary (0), secondary (1)
* Onchip routing for router rev-id 0x01/0xb0 and probably 0x00/0xb1:
*
* 0x62: USBIRQ: bits as in general case - but:
* bit 4 OHCI function disabled (0), enabled (1)
* 0x61: IDEIRQ:
* bits [6:5] must be written 01
* bit 4 channel-select primary (0), secondary (1)
*
* 0x62: USBIRQ:
* bit 6 OHCI function disabled (0), enabled (1)
*
* 0x6a: ACPI/SCI IRQ - bits as in general case
* 0x6a: ACPI/SCI IRQ: bits 4-6 reserved
*
* 0x7e: Data Acq. Module IRQ - bits 4-6 reserved
*
* We support USBIRQ (in addition to INTA-INTD) and keep the
* IDE, ACPI and DAQ routing untouched as set by the BIOS.
*
* Currently the only reported exception is the new SiS 65x chipset
* which includes the SiS 69x southbridge. Here we have the 85C503
* router revision 0x04 and there are changes in the register layout
* mostly related to the different USB HCs with USB 2.0 support.
*
*
0x7e: Data Acq. Module IRQ - bits as in general case
*
Onchip routing for router rev-id 0x04 (try-and-error observation)
*
* Apparently there are systems implementing PCI routing table using both
* link values 0x01-0x04 and 0x41-0x44 for PCI INTA..D, but register offsets
* like 0x62 as link values for USBIRQ e.g. So there is no simple
* "register = offset + pirq" relation.
* Currently we support PCI INTA..D and USBIRQ and try our best to handle
* both link mappings.
* IDE/ACPI/DAQ mapping is currently unsupported (left untouched as set by BIOS).
* 0x60/0x61/0x62/0x63: 1xEHCI and 3xOHCI (companion) USB-HCs
* bit 6-4 are probably unused, not like 5595
*/
static
int
pirq_sis_get
(
struct
pci_dev
*
router
,
struct
pci_dev
*
dev
,
int
pirq
)
#define PIRQ_SIS_IRQ_MASK 0x0f
#define PIRQ_SIS_IRQ_DISABLE 0x80
#define PIRQ_SIS_USB_ENABLE 0x40
/* return value:
* -1 on error
* 0 for PCI INTA-INTD
* 0 or enable bit mask to check or set for onchip functions
*/
static
inline
int
pirq_sis5595_onchip
(
int
pirq
,
int
*
reg
)
{
u8
x
;
int
reg
=
pirq
;
int
ret
=
-
1
;
*
reg
=
pirq
;
switch
(
pirq
)
{
case
0x01
:
case
0x02
:
case
0x03
:
case
0x04
:
reg
+=
0x40
;
case
0x41
:
case
0x42
:
case
0x43
:
case
0x44
:
case
0x62
:
pci_read_config_byte
(
router
,
reg
,
&
x
);
if
(
reg
!=
0x62
)
break
;
if
(
!
(
x
&
0x40
))
return
0
;
break
;
case
0x61
:
case
0x6a
:
case
0x7e
:
printk
(
KERN_INFO
"SiS pirq: advanced IDE/ACPI/DAQ mapping not yet implemented
\n
"
);
return
0
;
default:
printk
(
KERN_INFO
"SiS router pirq escape (%d)
\n
"
,
pirq
);
return
0
;
case
0x01
:
case
0x02
:
case
0x03
:
case
0x04
:
*
reg
+=
0x40
;
case
0x41
:
case
0x42
:
case
0x43
:
case
0x44
:
ret
=
0
;
break
;
case
0x62
:
ret
=
PIRQ_SIS_USB_ENABLE
;
/* documented for 5595 */
break
;
case
0x61
:
case
0x6a
:
case
0x7e
:
printk
(
KERN_INFO
"SiS pirq: IDE/ACPI/DAQ mapping not implemented: (%u)
\n
"
,
(
unsigned
)
pirq
);
/* fall thru */
default:
printk
(
KERN_INFO
"SiS router unknown request: (%u)
\n
"
,
(
unsigned
)
pirq
);
break
;
}
return
(
x
&
0x80
)
?
0
:
(
x
&
0x0f
)
;
}
return
ret
;
}
static
int
pirq_sis_set
(
struct
pci_dev
*
router
,
struct
pci_dev
*
dev
,
int
pirq
,
int
irq
)
/* return value:
* -1 on error
* 0 for PCI INTA-INTD
* 0 or enable bit mask to check or set for onchip functions
*/
static
inline
int
pirq_sis96x_onchip
(
int
pirq
,
int
*
reg
)
{
u8
x
;
int
reg
=
pirq
;
int
ret
=
-
1
;
*
reg
=
pirq
;
switch
(
pirq
)
{
case
0x01
:
case
0x02
:
case
0x03
:
case
0x04
:
reg
+=
0x40
;
case
0x41
:
case
0x42
:
case
0x43
:
case
0x44
:
case
0x62
:
x
=
(
irq
&
0x0f
)
?
(
irq
&
0x0f
)
:
0x80
;
if
(
reg
!=
0x62
)
break
;
/* always mark OHCI enabled, as nothing else knows about this */
x
|=
0x40
;
break
;
case
0x61
:
case
0x6a
:
case
0x7e
:
printk
(
KERN_INFO
"advanced SiS pirq mapping not yet implemented
\n
"
);
return
0
;
default:
printk
(
KERN_INFO
"SiS router pirq escape (%d)
\n
"
,
pirq
);
return
0
;
case
0x01
:
case
0x02
:
case
0x03
:
case
0x04
:
*
reg
+=
0x40
;
case
0x41
:
case
0x42
:
case
0x43
:
case
0x44
:
case
0x60
:
case
0x61
:
case
0x62
:
case
0x63
:
ret
=
0
;
break
;
default:
printk
(
KERN_INFO
"SiS router unknown request: (%u)
\n
"
,
(
unsigned
)
pirq
);
break
;
}
return
ret
;
}
static
int
pirq_sis5595_get
(
struct
pci_dev
*
router
,
struct
pci_dev
*
dev
,
int
pirq
)
{
u8
x
;
int
reg
,
check
;
check
=
pirq_sis5595_onchip
(
pirq
,
&
reg
);
if
(
check
<
0
)
return
0
;
pci_read_config_byte
(
router
,
reg
,
&
x
);
if
(
check
!=
0
&&
!
(
x
&
check
))
return
0
;
return
(
x
&
PIRQ_SIS_IRQ_DISABLE
)
?
0
:
(
x
&
PIRQ_SIS_IRQ_MASK
);
}
static
int
pirq_sis96x_get
(
struct
pci_dev
*
router
,
struct
pci_dev
*
dev
,
int
pirq
)
{
u8
x
;
int
reg
,
check
;
check
=
pirq_sis96x_onchip
(
pirq
,
&
reg
);
if
(
check
<
0
)
return
0
;
pci_read_config_byte
(
router
,
reg
,
&
x
);
if
(
check
!=
0
&&
!
(
x
&
check
))
return
0
;
return
(
x
&
PIRQ_SIS_IRQ_DISABLE
)
?
0
:
(
x
&
PIRQ_SIS_IRQ_MASK
);
}
static
int
pirq_sis5595_set
(
struct
pci_dev
*
router
,
struct
pci_dev
*
dev
,
int
pirq
,
int
irq
)
{
u8
x
;
int
reg
,
set
;
set
=
pirq_sis5595_onchip
(
pirq
,
&
reg
);
if
(
set
<
0
)
return
0
;
x
=
(
irq
&
PIRQ_SIS_IRQ_MASK
);
if
(
x
==
0
)
x
=
PIRQ_SIS_IRQ_DISABLE
;
else
x
|=
set
;
pci_write_config_byte
(
router
,
reg
,
x
);
return
1
;
}
static
int
pirq_sis96x_set
(
struct
pci_dev
*
router
,
struct
pci_dev
*
dev
,
int
pirq
,
int
irq
)
{
u8
x
;
int
reg
,
set
;
set
=
pirq_sis96x_onchip
(
pirq
,
&
reg
);
if
(
set
<
0
)
return
0
;
x
=
(
irq
&
PIRQ_SIS_IRQ_MASK
);
if
(
x
==
0
)
x
=
PIRQ_SIS_IRQ_DISABLE
;
else
x
|=
set
;
pci_write_config_byte
(
router
,
reg
,
x
);
return
1
;
}
/*
* VLSI: nibble offset 0x74 - educated guess due to routing table and
* config space of VLSI 82C534 PCI-bridge/router (1004:0102)
...
...
@@ -455,96 +569,252 @@ static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq,
return
pcibios_set_irq_routing
(
bridge
,
pin
,
irq
);
}
static
struct
irq_router
pirq_bios_router
=
{
"BIOS"
,
0
,
0
,
NULL
,
pirq_bios_set
};
#endif
static
__init
int
intel_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
#if 0 /* Let's see what chip this is supposed to be ... */
/* We must not touch 440GX even if we have tables. 440GX has
different IRQ routing weirdness */
if (pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82440GX, NULL))
return 0;
#endif
static
struct
irq_router
pirq_routers
[]
=
{
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371FB_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371SB_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371AB_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82371MX
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82443MX_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801AA_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801AB_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801BA_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801BA_10
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801CA_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801CA_12
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801DB_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801E_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801EB_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"PIIX"
,
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_ESB_0
,
pirq_piix_get
,
pirq_piix_set
},
{
"ALI"
,
PCI_VENDOR_ID_AL
,
PCI_DEVICE_ID_AL_M1533
,
pirq_ali_get
,
pirq_ali_set
},
{
"ITE"
,
PCI_VENDOR_ID_ITE
,
PCI_DEVICE_ID_ITE_IT8330G_0
,
pirq_ite_get
,
pirq_ite_set
},
{
"VIA"
,
PCI_VENDOR_ID_VIA
,
PCI_DEVICE_ID_VIA_82C586_0
,
pirq_via_get
,
pirq_via_set
},
{
"VIA"
,
PCI_VENDOR_ID_VIA
,
PCI_DEVICE_ID_VIA_82C596
,
pirq_via_get
,
pirq_via_set
},
{
"VIA"
,
PCI_VENDOR_ID_VIA
,
PCI_DEVICE_ID_VIA_82C686
,
pirq_via_get
,
pirq_via_set
},
{
"OPTI"
,
PCI_VENDOR_ID_OPTI
,
PCI_DEVICE_ID_OPTI_82C700
,
pirq_opti_get
,
pirq_opti_set
},
{
"NatSemi"
,
PCI_VENDOR_ID_CYRIX
,
PCI_DEVICE_ID_CYRIX_5520
,
pirq_cyrix_get
,
pirq_cyrix_set
},
{
"SIS"
,
PCI_VENDOR_ID_SI
,
PCI_DEVICE_ID_SI_503
,
pirq_sis_get
,
pirq_sis_set
},
{
"VLSI 82C534"
,
PCI_VENDOR_ID_VLSI
,
PCI_DEVICE_ID_VLSI_82C534
,
pirq_vlsi_get
,
pirq_vlsi_set
},
{
"ServerWorks"
,
PCI_VENDOR_ID_SERVERWORKS
,
PCI_DEVICE_ID_SERVERWORKS_OSB4
,
pirq_serverworks_get
,
pirq_serverworks_set
},
{
"ServerWorks"
,
PCI_VENDOR_ID_SERVERWORKS
,
PCI_DEVICE_ID_SERVERWORKS_CSB5
,
pirq_serverworks_get
,
pirq_serverworks_set
},
{
"AMD756 VIPER"
,
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_VIPER_740B
,
pirq_amd756_get
,
pirq_amd756_set
},
{
"AMD766"
,
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_VIPER_7413
,
pirq_amd756_get
,
pirq_amd756_set
},
{
"AMD768"
,
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_OPUS_7443
,
pirq_amd756_get
,
pirq_amd756_set
},
{
"default"
,
0
,
0
,
NULL
,
NULL
}
};
switch
(
device
)
{
case
PCI_DEVICE_ID_INTEL_82371FB_0
:
case
PCI_DEVICE_ID_INTEL_82371SB_0
:
case
PCI_DEVICE_ID_INTEL_82371AB_0
:
case
PCI_DEVICE_ID_INTEL_82371MX
:
case
PCI_DEVICE_ID_INTEL_82443MX_0
:
case
PCI_DEVICE_ID_INTEL_82801AA_0
:
case
PCI_DEVICE_ID_INTEL_82801AB_0
:
case
PCI_DEVICE_ID_INTEL_82801BA_0
:
case
PCI_DEVICE_ID_INTEL_82801BA_10
:
case
PCI_DEVICE_ID_INTEL_82801CA_0
:
case
PCI_DEVICE_ID_INTEL_82801CA_12
:
case
PCI_DEVICE_ID_INTEL_82801DB_0
:
case
PCI_DEVICE_ID_INTEL_82801E_0
:
case
PCI_DEVICE_ID_INTEL_82801EB_0
:
case
PCI_DEVICE_ID_INTEL_ESB_0
:
r
->
name
=
"PIIX/ICH"
;
r
->
get
=
pirq_piix_get
;
r
->
set
=
pirq_piix_set
;
return
1
;
}
return
0
;
}
static
struct
irq_router
*
pirq_router
;
static
__init
int
via_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
/* FIXME: We should move some of the quirk fixup stuff here */
switch
(
device
)
{
case
PCI_DEVICE_ID_VIA_82C586_0
:
case
PCI_DEVICE_ID_VIA_82C596
:
case
PCI_DEVICE_ID_VIA_82C686
:
case
PCI_DEVICE_ID_VIA_8231
:
/* FIXME: add new ones for 8233/5 */
r
->
name
=
"VIA"
;
r
->
get
=
pirq_via_get
;
r
->
set
=
pirq_via_set
;
return
1
;
}
return
0
;
}
static
__init
int
vlsi_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
switch
(
device
)
{
case
PCI_DEVICE_ID_VLSI_82C534
:
r
->
name
=
"VLSI 82C534"
;
r
->
get
=
pirq_vlsi_get
;
r
->
set
=
pirq_vlsi_set
;
return
1
;
}
return
0
;
}
static
__init
int
serverworks_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
switch
(
device
)
{
case
PCI_DEVICE_ID_SERVERWORKS_OSB4
:
case
PCI_DEVICE_ID_SERVERWORKS_CSB5
:
r
->
name
=
"ServerWorks"
;
r
->
get
=
pirq_serverworks_get
;
r
->
set
=
pirq_serverworks_set
;
return
1
;
}
return
0
;
}
static
__init
int
sis_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
if
(
device
!=
PCI_DEVICE_ID_SI_503
)
return
0
;
/*
* In case of SiS south bridge, we need to detect the two
* kinds of routing tables we have seen so far (5595 and 96x).
*
* The 96x tends to still come with routing tables that claim
* to be 503's.. Silly thing. Check the actual router chip.
*/
if
((
router
->
device
&
0xfff0
)
==
0x0960
)
{
r
->
name
=
"SIS96x"
;
r
->
get
=
pirq_sis96x_get
;
r
->
set
=
pirq_sis96x_set
;
DBG
(
"PCI: Detecting SiS router at %02x:%02x : SiS096x detected
\n
"
,
rt
->
rtr_bus
,
rt
->
rtr_devfn
);
}
else
{
r
->
name
=
"SIS5595"
;
r
->
get
=
pirq_sis5595_get
;
r
->
set
=
pirq_sis5595_set
;
DBG
(
"PCI: Detecting SiS router at %02x:%02x : SiS5595 detected
\n
"
,
rt
->
rtr_bus
,
rt
->
rtr_devfn
);
}
return
1
;
}
static
__init
int
cyrix_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
switch
(
device
)
{
case
PCI_DEVICE_ID_CYRIX_5520
:
r
->
name
=
"NatSemi"
;
r
->
get
=
pirq_cyrix_get
;
r
->
set
=
pirq_cyrix_set
;
return
1
;
}
return
0
;
}
static
__init
int
opti_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
switch
(
device
)
{
case
PCI_DEVICE_ID_OPTI_82C700
:
r
->
name
=
"OPTI"
;
r
->
get
=
pirq_opti_get
;
r
->
set
=
pirq_opti_set
;
return
1
;
}
return
0
;
}
static
__init
int
ite_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
switch
(
device
)
{
case
PCI_DEVICE_ID_ITE_IT8330G_0
:
r
->
name
=
"ITE"
;
r
->
get
=
pirq_ite_get
;
r
->
set
=
pirq_ite_set
;
return
1
;
}
return
0
;
}
static
__init
int
ali_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
switch
(
device
)
{
case
PCI_DEVICE_ID_AL_M1533
:
r
->
name
=
"ALI"
;
r
->
get
=
pirq_ali_get
;
r
->
set
=
pirq_ali_set
;
return
1
;
/* Should add 156x some day */
}
return
0
;
}
static
__init
int
amd_router_probe
(
struct
irq_router
*
r
,
struct
pci_dev
*
router
,
u16
device
)
{
switch
(
device
)
{
case
PCI_DEVICE_ID_AMD_VIPER_740B
:
r
->
name
=
"AMD756"
;
break
;
case
PCI_DEVICE_ID_AMD_VIPER_7413
:
r
->
name
=
"AMD766"
;
break
;
case
PCI_DEVICE_ID_AMD_VIPER_7443
:
r
->
name
=
"AMD768"
;
break
;
default:
return
0
;
}
r
->
get
=
pirq_amd756_get
;
r
->
set
=
pirq_amd756_set
;
return
1
;
}
static
__initdata
struct
irq_router_handler
pirq_routers
[]
=
{
{
PCI_VENDOR_ID_INTEL
,
intel_router_probe
},
{
PCI_VENDOR_ID_AL
,
ali_router_probe
},
{
PCI_VENDOR_ID_ITE
,
ite_router_probe
},
{
PCI_VENDOR_ID_VIA
,
via_router_probe
},
{
PCI_VENDOR_ID_OPTI
,
opti_router_probe
},
{
PCI_VENDOR_ID_SI
,
sis_router_probe
},
{
PCI_VENDOR_ID_CYRIX
,
cyrix_router_probe
},
{
PCI_VENDOR_ID_VLSI
,
vlsi_router_probe
},
{
PCI_VENDOR_ID_SERVERWORKS
,
serverworks_router_probe
},
{
PCI_VENDOR_ID_AMD
,
amd_router_probe
},
/* Someone with docs needs to add the ATI Radeon IGP */
{
0
,
NULL
}
};
static
struct
irq_router
pirq_router
;
static
struct
pci_dev
*
pirq_router_dev
;
static
void
__init
pirq_find_router
(
void
)
/*
* FIXME: should we have an option to say "generic for
* chipset" ?
*/
static
void
__init
pirq_find_router
(
struct
irq_router
*
r
)
{
struct
irq_routing_table
*
rt
=
pirq_table
;
struct
irq_router
*
r
;
struct
irq_router
_handler
*
h
;
#ifdef CONFIG_PCI_BIOS
if
(
!
rt
->
signature
)
{
printk
(
KERN_INFO
"PCI: Using BIOS for IRQ routing
\n
"
);
pirq_router
=
&
pirq_bios_router
;
r
->
set
=
pirq_bios_set
;
r
->
name
=
"BIOS"
;
return
;
}
#endif
/* Default unless a driver reloads it */
r
->
name
=
"default"
;
r
->
get
=
NULL
;
r
->
set
=
NULL
;
DBG
(
"PCI: Attempting to find IRQ router for %04x:%04x
\n
"
,
rt
->
rtr_vendor
,
rt
->
rtr_device
);
/* fall back to default router if nothing else found */
pirq_router
=
&
pirq_routers
[
ARRAY_SIZE
(
pirq_routers
)
-
1
];
pirq_router_dev
=
pci_find_slot
(
rt
->
rtr_bus
,
rt
->
rtr_devfn
);
if
(
!
pirq_router_dev
)
{
DBG
(
"PCI: Interrupt router not found at %02x:%02x
\n
"
,
rt
->
rtr_bus
,
rt
->
rtr_devfn
);
return
;
}
for
(
r
=
pirq_routers
;
r
->
vendor
;
r
++
)
{
/* Exact match against router table entry? Use it! */
if
(
r
->
vendor
==
rt
->
rtr_vendor
&&
r
->
device
==
rt
->
rtr_device
)
{
pirq_router
=
r
;
for
(
h
=
pirq_routers
;
h
->
vendor
;
h
++
)
{
/* First look for a router match */
if
(
rt
->
rtr_vendor
==
h
->
vendor
&&
h
->
probe
(
r
,
pirq_router_dev
,
rt
->
rtr_device
))
break
;
/* Fall back to a device match */
if
(
pirq_router_dev
->
vendor
==
h
->
vendor
&&
h
->
probe
(
r
,
pirq_router_dev
,
pirq_router_dev
->
device
))
break
;
}
/* Match against router device entry? Use it as a fallback */
if
(
r
->
vendor
==
pirq_router_dev
->
vendor
&&
r
->
device
==
pirq_router_dev
->
device
)
{
pirq_router
=
r
;
}
}
printk
(
KERN_INFO
"PCI: Using IRQ router %s [%04x/%04x] at %s
\n
"
,
pirq_router
->
name
,
pirq_router
.
name
,
pirq_router_dev
->
vendor
,
pirq_router_dev
->
device
,
pci_name
(
pirq_router_dev
));
...
...
@@ -574,7 +844,7 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
int
i
,
pirq
,
newirq
;
int
irq
=
0
;
u32
mask
;
struct
irq_router
*
r
=
pirq_router
;
struct
irq_router
*
r
=
&
pirq_router
;
struct
pci_dev
*
dev2
=
NULL
;
char
*
msg
=
NULL
;
...
...
@@ -775,7 +1045,7 @@ static int __init pcibios_irq_init(void)
#endif
if
(
pirq_table
)
{
pirq_peer_trick
();
pirq_find_router
();
pirq_find_router
(
&
pirq_router
);
if
(
pirq_table
->
exclusive_irqs
)
{
int
i
;
for
(
i
=
0
;
i
<
16
;
i
++
)
...
...
crypto/api.c
View file @
3ea7f245
...
...
@@ -36,6 +36,9 @@ static inline void crypto_alg_put(struct crypto_alg *alg)
struct
crypto_alg
*
crypto_alg_lookup
(
const
char
*
name
)
{
struct
crypto_alg
*
q
,
*
alg
=
NULL
;
if
(
!
name
)
return
NULL
;
down_read
(
&
crypto_alg_sem
);
...
...
drivers/ide/pci/amd74xx.c
View file @
3ea7f245
/*
* Version 2.1
1
* Version 2.1
3
*
* AMD 755/756/766/8111 and nVidia nForce IDE driver for Linux.
* AMD 755/756/766/8111 and nVidia nForce
/2/2s/3/3s
IDE driver for Linux.
*
* Copyright (c) 2000-2002 Vojtech Pavlik
*
...
...
@@ -40,9 +40,11 @@
#define AMD_UDMA_33 0x01
#define AMD_UDMA_66 0x02
#define AMD_UDMA_100 0x03
#define AMD_UDMA_133 0x04
#define AMD_CHECK_SWDMA 0x08
#define AMD_BAD_SWDMA 0x10
#define AMD_BAD_FIFO 0x20
#define AMD_CHECK_SERENADE 0x40
/*
* AMD SouthBridge chips.
...
...
@@ -50,27 +52,33 @@
static
struct
amd_ide_chip
{
unsigned
short
id
;
unsigned
char
rev
;
unsigned
long
base
;
unsigned
char
flags
;
}
amd_ide_chips
[]
=
{
{
PCI_DEVICE_ID_AMD_COBRA_7401
,
0x00
,
0x40
,
AMD_UDMA_33
|
AMD_BAD_SWDMA
},
/* AMD-755 Cobra */
{
PCI_DEVICE_ID_AMD_VIPER_7409
,
0x00
,
0x40
,
AMD_UDMA_66
|
AMD_CHECK_SWDMA
},
/* AMD-756 Viper */
{
PCI_DEVICE_ID_AMD_VIPER_7411
,
0x00
,
0x40
,
AMD_UDMA_100
|
AMD_BAD_FIFO
},
/* AMD-766 Viper */
{
PCI_DEVICE_ID_AMD_OPUS_7441
,
0x00
,
0x40
,
AMD_UDMA_100
},
/* AMD-768 Opus */
{
PCI_DEVICE_ID_AMD_8111_IDE
,
0x00
,
0x40
,
AMD_UDMA_100
},
/* AMD-8111 */
{
PCI_DEVICE_ID_NVIDIA_NFORCE_IDE
,
0x00
,
0x50
,
AMD_UDMA_100
},
/* nVidia nForce */
{
PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE
,
0x00
,
0x50
,
AMD_UDMA_100
},
/* nVidia nForce 2 */
{
PCI_DEVICE_ID_AMD_COBRA_7401
,
0x40
,
AMD_UDMA_33
|
AMD_BAD_SWDMA
},
{
PCI_DEVICE_ID_AMD_VIPER_7409
,
0x40
,
AMD_UDMA_66
|
AMD_CHECK_SWDMA
},
{
PCI_DEVICE_ID_AMD_VIPER_7411
,
0x40
,
AMD_UDMA_100
|
AMD_BAD_FIFO
},
{
PCI_DEVICE_ID_AMD_OPUS_7441
,
0x40
,
AMD_UDMA_100
},
{
PCI_DEVICE_ID_AMD_8111_IDE
,
0x40
,
AMD_UDMA_133
|
AMD_CHECK_SERENADE
},
{
PCI_DEVICE_ID_NVIDIA_NFORCE_IDE
,
0x50
,
AMD_UDMA_100
},
{
PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE
,
0x50
,
AMD_UDMA_133
},
{
PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE
,
0x50
,
AMD_UDMA_133
},
{
PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA
,
0x50
,
AMD_UDMA_133
},
{
PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE
,
0x50
,
AMD_UDMA_133
},
{
PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE
,
0x50
,
AMD_UDMA_133
},
{
PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA
,
0x50
,
AMD_UDMA_133
},
{
PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2
,
0x50
,
AMD_UDMA_133
},
{
0
}
};
static
struct
amd_ide_chip
*
amd_config
;
static
ide_pci_device_t
*
amd_chipset
;
static
unsigned
int
amd_80w
;
static
unsigned
int
amd_clock
;
static
unsigned
char
amd_cyc2udma
[]
=
{
6
,
6
,
5
,
4
,
0
,
1
,
1
,
2
,
2
,
3
,
3
};
static
unsigned
char
amd_udma2cyc
[]
=
{
4
,
6
,
8
,
10
,
3
,
2
,
1
,
1
};
static
char
*
amd_dma
[]
=
{
"MWDMA16"
,
"UDMA33"
,
"UDMA66"
,
"UDMA100"
};
static
unsigned
char
amd_cyc2udma
[]
=
{
6
,
6
,
5
,
4
,
0
,
1
,
1
,
2
,
2
,
3
,
3
,
3
,
3
,
3
,
3
,
7
};
static
unsigned
char
amd_udma2cyc
[]
=
{
4
,
6
,
8
,
10
,
3
,
2
,
1
,
1
5
};
static
char
*
amd_dma
[]
=
{
"MWDMA16"
,
"UDMA33"
,
"UDMA66"
,
"UDMA100"
,
"UDMA133"
};
/*
* AMD /proc entry.
...
...
@@ -102,7 +110,7 @@ static int amd74xx_get_info(char *buffer, char **addr, off_t offset, int count)
amd_print
(
"----------AMD BusMastering IDE Configuration----------------"
);
amd_print
(
"Driver Version: 2.1
1
"
);
amd_print
(
"Driver Version: 2.1
3
"
);
amd_print
(
"South Bridge: %s"
,
pci_name
(
bmide_dev
));
pci_read_config_byte
(
dev
,
PCI_REVISION_ID
,
&
t
);
...
...
@@ -153,6 +161,12 @@ static int amd74xx_get_info(char *buffer, char **addr, off_t offset, int count)
continue
;
}
if
(
den
[
i
]
&&
uen
[
i
]
&&
udma
[
i
]
==
15
)
{
speed
[
i
]
=
amd_clock
*
4
;
cycle
[
i
]
=
500000
/
amd_clock
;
continue
;
}
speed
[
i
]
=
4
*
amd_clock
/
((
den
[
i
]
&&
uen
[
i
])
?
udma
[
i
]
:
(
active
[
i
]
+
recover
[
i
])
*
2
);
cycle
[
i
]
=
1000000
*
((
den
[
i
]
&&
uen
[
i
])
?
udma
[
i
]
:
(
active
[
i
]
+
recover
[
i
])
*
2
)
/
amd_clock
/
2
;
}
...
...
@@ -198,6 +212,7 @@ static void amd_set_speed(struct pci_dev *dev, unsigned char dn, struct ide_timi
case
AMD_UDMA_33
:
t
=
timing
->
udma
?
(
0xc0
|
(
FIT
(
timing
->
udma
,
2
,
5
)
-
2
))
:
0x03
;
break
;
case
AMD_UDMA_66
:
t
=
timing
->
udma
?
(
0xc0
|
amd_cyc2udma
[
FIT
(
timing
->
udma
,
2
,
10
)])
:
0x03
;
break
;
case
AMD_UDMA_100
:
t
=
timing
->
udma
?
(
0xc0
|
amd_cyc2udma
[
FIT
(
timing
->
udma
,
1
,
10
)])
:
0x03
;
break
;
case
AMD_UDMA_133
:
t
=
timing
->
udma
?
(
0xc0
|
amd_cyc2udma
[
FIT
(
timing
->
udma
,
1
,
15
)])
:
0x03
;
break
;
default:
return
;
}
...
...
@@ -232,6 +247,7 @@ static int amd_set_drive(ide_drive_t *drive, u8 speed)
}
if
(
speed
==
XFER_UDMA_5
&&
amd_clock
<=
33333
)
t
.
udma
=
1
;
if
(
speed
==
XFER_UDMA_6
&&
amd_clock
<=
33333
)
t
.
udma
=
15
;
amd_set_speed
(
HWIF
(
drive
)
->
pci_dev
,
drive
->
dn
,
&
t
);
...
...
@@ -271,7 +287,8 @@ static int amd74xx_ide_dma_check(ide_drive_t *drive)
XFER_PIO
|
XFER_EPIO
|
XFER_MWDMA
|
XFER_UDMA
|
((
amd_config
->
flags
&
AMD_BAD_SWDMA
)
?
0
:
XFER_SWDMA
)
|
(
w80
&&
(
amd_config
->
flags
&
AMD_UDMA
)
>=
AMD_UDMA_66
?
XFER_UDMA_66
:
0
)
|
(
w80
&&
(
amd_config
->
flags
&
AMD_UDMA
)
>=
AMD_UDMA_100
?
XFER_UDMA_100
:
0
));
(
w80
&&
(
amd_config
->
flags
&
AMD_UDMA
)
>=
AMD_UDMA_100
?
XFER_UDMA_100
:
0
)
|
(
w80
&&
(
amd_config
->
flags
&
AMD_UDMA
)
>=
AMD_UDMA_133
?
XFER_UDMA_133
:
0
));
amd_set_drive
(
drive
,
speed
);
...
...
@@ -307,13 +324,15 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
switch
(
amd_config
->
flags
&
AMD_UDMA
)
{
case
AMD_UDMA_133
:
case
AMD_UDMA_100
:
pci_read_config_byte
(
dev
,
AMD_CABLE_DETECT
,
&
t
);
pci_read_config_dword
(
dev
,
AMD_UDMA_TIMING
,
&
u
);
amd_80w
=
((
t
&
0x3
)
?
1
:
0
)
|
((
t
&
0xc
)
?
2
:
0
);
for
(
i
=
24
;
i
>=
0
;
i
-=
8
)
if
(((
u
>>
i
)
&
4
)
&&
!
(
amd_80w
&
(
1
<<
(
1
-
(
i
>>
4
)))))
{
printk
(
KERN_WARNING
"AMD_IDE: Bios didn't set cable bits correctly. Enabling workaround.
\n
"
);
printk
(
KERN_WARNING
"%s: BIOS didn't set cable bits correctly. Enabling workaround.
\n
"
,
amd_chipset
->
name
);
amd_80w
|=
(
1
<<
(
1
-
(
i
>>
4
)));
}
break
;
...
...
@@ -334,6 +353,15 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
pci_write_config_byte
(
dev
,
AMD_IDE_CONFIG
,
(
amd_config
->
flags
&
AMD_BAD_FIFO
)
?
(
t
&
0x0f
)
:
(
t
|
0xf0
));
/*
* Take care of incorrectly wired Serenade mainboards.
*/
if
((
amd_config
->
flags
&
AMD_CHECK_SERENADE
)
&&
dev
->
subsystem_vendor
==
PCI_VENDOR_ID_AMD
&&
dev
->
subsystem_device
==
PCI_DEVICE_ID_AMD_SERENADE
)
amd_config
->
flags
=
AMD_UDMA_100
;
/*
* Determine the system bus clock.
*/
...
...
@@ -347,8 +375,10 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
}
if
(
amd_clock
<
20000
||
amd_clock
>
50000
)
{
printk
(
KERN_WARNING
"AMD_IDE: User given PCI clock speed impossible (%d), using 33 MHz instead.
\n
"
,
amd_clock
);
printk
(
KERN_WARNING
"AMD_IDE: Use ide0=ata66 if you want to assume 80-wire cable
\n
"
);
printk
(
KERN_WARNING
"%s: User given PCI clock speed impossible (%d), using 33 MHz instead.
\n
"
,
amd_chipset
->
name
,
amd_clock
);
printk
(
KERN_WARNING
"%s: Use ide0=ata66 if you want to assume 80-wire cable
\n
"
,
amd_chipset
->
name
);
amd_clock
=
33333
;
}
...
...
@@ -357,8 +387,8 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
*/
pci_read_config_byte
(
dev
,
PCI_REVISION_ID
,
&
t
);
printk
(
KERN_INFO
"
AMD_IDE: %s (rev %02x) %s controller on pci%s
\n
"
,
pci_name
(
dev
),
t
,
amd_dma
[
amd_config
->
flags
&
AMD_UDMA
],
pci_name
(
dev
)
);
printk
(
KERN_INFO
"
%s: %s (rev %02x) %s controller
\n
"
,
amd_chipset
->
name
,
pci_name
(
dev
),
t
,
amd_dma
[
amd_config
->
flags
&
AMD_UDMA
]
);
/*
* Register /proc/ide/amd74xx entry
...
...
@@ -373,8 +403,7 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
}
#endif
/* DISPLAY_AMD_TIMINGS && CONFIG_PROC_FS */
return
0
;
return
dev
->
irq
;
}
static
void
__init
init_hwif_amd74xx
(
ide_hwif_t
*
hwif
)
...
...
@@ -414,23 +443,29 @@ extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *);
static
int
__devinit
amd74xx_probe
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
ide_pci_device_t
*
d
=
amd74xx_chipsets
+
id
->
driver_data
;
amd_chipset
=
amd74xx_chipsets
+
id
->
driver_data
;
amd_config
=
amd_ide_chips
+
id
->
driver_data
;
if
(
dev
->
device
!=
d
->
device
)
BUG
();
if
(
dev
->
device
!=
amd_chipset
->
device
)
BUG
();
if
(
dev
->
device
!=
amd_config
->
id
)
BUG
();
ide_setup_pci_device
(
dev
,
d
);
ide_setup_pci_device
(
dev
,
amd_chipset
);
MOD_INC_USE_COUNT
;
return
0
;
}
static
struct
pci_device_id
amd74xx_pci_tbl
[]
=
{
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_COBRA_7401
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_VIPER_7409
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_VIPER_7411
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_OPUS_7441
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_8111_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
4
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
5
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
6
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_COBRA_7401
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_VIPER_7409
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
1
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_VIPER_7411
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
2
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_OPUS_7441
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
3
},
{
PCI_VENDOR_ID_AMD
,
PCI_DEVICE_ID_AMD_8111_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
4
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
5
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
6
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
7
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
8
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
9
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
10
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
11
},
{
PCI_VENDOR_ID_NVIDIA
,
PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
12
},
{
0
,
},
};
...
...
drivers/ide/pci/amd74xx.h
View file @
3ea7f245
...
...
@@ -109,6 +109,72 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
.
bootable
=
ON_BOARD
,
.
extra
=
0
,
},
{
/* 7 */
.
vendor
=
PCI_VENDOR_ID_NVIDIA
,
.
device
=
PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE
,
.
name
=
"NFORCE2S"
,
.
init_chipset
=
init_chipset_amd74xx
,
.
init_hwif
=
init_hwif_amd74xx
,
.
channels
=
2
,
.
autodma
=
AUTODMA
,
.
enablebits
=
{{
0x50
,
0x02
,
0x02
},
{
0x50
,
0x01
,
0x01
}},
.
bootable
=
ON_BOARD
,
},
{
/* 8 */
.
vendor
=
PCI_VENDOR_ID_NVIDIA
,
.
device
=
PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA
,
.
name
=
"NFORCE2S-SATA"
,
.
init_chipset
=
init_chipset_amd74xx
,
.
init_hwif
=
init_hwif_amd74xx
,
.
channels
=
2
,
.
autodma
=
AUTODMA
,
.
enablebits
=
{{
0x50
,
0x02
,
0x02
},
{
0x50
,
0x01
,
0x01
}},
.
bootable
=
ON_BOARD
,
},
{
/* 9 */
.
vendor
=
PCI_VENDOR_ID_NVIDIA
,
.
device
=
PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE
,
.
name
=
"NFORCE3"
,
.
init_chipset
=
init_chipset_amd74xx
,
.
init_hwif
=
init_hwif_amd74xx
,
.
channels
=
2
,
.
autodma
=
AUTODMA
,
.
enablebits
=
{{
0x50
,
0x02
,
0x02
},
{
0x50
,
0x01
,
0x01
}},
.
bootable
=
ON_BOARD
,
},
{
/* 10 */
.
vendor
=
PCI_VENDOR_ID_NVIDIA
,
.
device
=
PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE
,
.
name
=
"NFORCE3S"
,
.
init_chipset
=
init_chipset_amd74xx
,
.
init_hwif
=
init_hwif_amd74xx
,
.
channels
=
2
,
.
autodma
=
AUTODMA
,
.
enablebits
=
{{
0x50
,
0x02
,
0x02
},
{
0x50
,
0x01
,
0x01
}},
.
bootable
=
ON_BOARD
,
},
{
/* 11 */
.
vendor
=
PCI_VENDOR_ID_NVIDIA
,
.
device
=
PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA
,
.
name
=
"NFORCE3S-SATA"
,
.
init_chipset
=
init_chipset_amd74xx
,
.
init_hwif
=
init_hwif_amd74xx
,
.
channels
=
2
,
.
autodma
=
AUTODMA
,
.
enablebits
=
{{
0x50
,
0x02
,
0x02
},
{
0x50
,
0x01
,
0x01
}},
.
bootable
=
ON_BOARD
,
},
{
/* 12 */
.
vendor
=
PCI_VENDOR_ID_NVIDIA
,
.
device
=
PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2
,
.
name
=
"NFORCE3S-SATA2"
,
.
init_chipset
=
init_chipset_amd74xx
,
.
init_hwif
=
init_hwif_amd74xx
,
.
channels
=
2
,
.
autodma
=
AUTODMA
,
.
enablebits
=
{{
0x50
,
0x02
,
0x02
},
{
0x50
,
0x01
,
0x01
}},
.
bootable
=
ON_BOARD
,
},
{
.
vendor
=
0
,
.
device
=
0
,
...
...
drivers/net/8139cp.c
View file @
3ea7f245
...
...
@@ -615,8 +615,8 @@ static int cp_rx_poll (struct net_device *dev, int *budget)
if
(
cpr16
(
IntrStatus
)
&
cp_rx_intr_mask
)
goto
rx_status_loop
;
cpw16_f
(
IntrMask
,
cp_intr_mask
);
netif_rx_complete
(
dev
);
cpw16_f
(
IntrMask
,
cp_intr_mask
);
return
0
;
/* done */
}
...
...
drivers/pci/quirks.c
View file @
3ea7f245
...
...
@@ -750,13 +750,35 @@ static void __init quirk_sis_96x_smbus(struct pci_dev *dev)
* bridges pretend to be 85C503/5513 instead. In that case see if we
* spotted a compatible north bridge to make sure.
* (pci_find_device doesn't work yet)
*
* We can also enable the sis96x bit in the discovery register..
*/
static
int
__devinitdata
sis_96x_compatible
=
0
;
#define SIS_DETECT_REGISTER 0x40
static
void
__init
quirk_sis_503_smbus
(
struct
pci_dev
*
dev
)
{
if
(
sis_96x_compatible
)
quirk_sis_96x_smbus
(
dev
);
u8
reg
;
u16
devid
;
pci_read_config_byte
(
dev
,
SIS_DETECT_REGISTER
,
&
reg
);
pci_write_config_byte
(
dev
,
SIS_DETECT_REGISTER
,
reg
|
(
1
<<
6
));
pci_read_config_word
(
dev
,
PCI_DEVICE_ID
,
&
devid
);
if
((
devid
&
0xfff0
)
!=
0x0960
)
{
pci_write_config_byte
(
dev
,
SIS_DETECT_REGISTER
,
reg
);
return
;
}
/* Make people aware that we changed the config.. */
printk
(
KERN_WARNING
"Uncovering SIS%x that hid as a SIS503 (compatible=%d)
\n
"
,
devid
,
sis_96x_compatible
);
/*
* Ok, it now shows up as a 96x.. The 96x quirks are after
* the 503 quirk in the quirk table, so they'll automatically
* run and enable things like the SMBus device
*/
dev
->
device
=
devid
;
}
static
void
__init
quirk_sis_96x_compatible
(
struct
pci_dev
*
dev
)
...
...
drivers/scsi/Kconfig
View file @
3ea7f245
...
...
@@ -457,7 +457,7 @@ config SCSI_SATA_VIA
config SCSI_BUSLOGIC
tristate "BusLogic SCSI support"
depends on (PCI || ISA) && SCSI
depends on (PCI || ISA
|| MCA
) && SCSI
---help---
This is support for BusLogic MultiMaster and FlashPoint SCSI Host
Adapters. Consult the SCSI-HOWTO, available from
...
...
drivers/scsi/ata_piix.c
View file @
3ea7f245
...
...
@@ -117,6 +117,9 @@ static struct ata_port_operations piix_pata_ops = {
.
eng_timeout
=
ata_eng_timeout
,
.
irq_handler
=
ata_interrupt
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
};
static
struct
ata_port_operations
piix_sata_ops
=
{
...
...
@@ -137,6 +140,9 @@ static struct ata_port_operations piix_sata_ops = {
.
eng_timeout
=
ata_eng_timeout
,
.
irq_handler
=
ata_interrupt
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
};
static
struct
ata_port_info
piix_port_info
[]
=
{
...
...
drivers/scsi/constants.c
View file @
3ea7f245
...
...
@@ -915,15 +915,15 @@ scsi_show_extd_sense(unsigned char asc, unsigned char ascq) {
/* Print sense information */
static
void
print_sense_internal
(
const
char
*
devclass
,
const
unsigned
char
*
sense_buffer
,
print_sense_internal
(
const
char
*
devclass
,
const
unsigned
char
*
sense_buffer
,
struct
request
*
req
)
{
int
s
,
sense_class
,
valid
,
code
,
info
;
const
char
*
error
=
NULL
;
const
char
*
error
=
NULL
;
unsigned
char
asc
,
ascq
;
const
char
*
sense_txt
;
c
har
*
name
=
req
->
rq_disk
?
req
->
rq_disk
->
disk_name
:
"?"
;
c
onst
char
*
name
=
req
->
rq_disk
?
req
->
rq_disk
->
disk_name
:
devclass
;
sense_class
=
(
sense_buffer
[
0
]
>>
4
)
&
0x07
;
code
=
sense_buffer
[
0
]
&
0xf
;
...
...
@@ -966,11 +966,9 @@ print_sense_internal(const char * devclass,
sense_txt
=
scsi_sense_key_string
(
sense_buffer
[
2
]);
if
(
sense_txt
)
printk
(
"%s%s: sense key %s
\n
"
,
devclass
,
name
,
sense_txt
);
printk
(
"%s: sense key %s
\n
"
,
name
,
sense_txt
);
else
printk
(
"%s%s: sense = %2x %2x
\n
"
,
devclass
,
name
,
printk
(
"%s: sense = %2x %2x
\n
"
,
name
,
sense_buffer
[
0
],
sense_buffer
[
2
]);
asc
=
ascq
=
0
;
...
...
@@ -993,11 +991,9 @@ print_sense_internal(const char * devclass,
sense_txt
=
scsi_sense_key_string
(
sense_buffer
[
0
]);
if
(
sense_txt
)
printk
(
"%s%s: old sense key %s
\n
"
,
devclass
,
name
,
sense_txt
);
printk
(
"%s: old sense key %s
\n
"
,
name
,
sense_txt
);
else
printk
(
"%s%s: sense = %2x %2x
\n
"
,
devclass
,
name
,
printk
(
"%s: sense = %2x %2x
\n
"
,
name
,
sense_buffer
[
0
],
sense_buffer
[
2
]);
printk
(
"Non-extended sense class %d code 0x%0x
\n
"
,
...
...
drivers/scsi/libata-core.c
View file @
3ea7f245
...
...
@@ -1058,10 +1058,12 @@ void sata_phy_reset(struct ata_port *ap)
u32
sstatus
;
unsigned
long
timeout
=
jiffies
+
(
HZ
*
5
);
scr_write
(
ap
,
SCR_CONTROL
,
0x301
);
/* issue phy wake/reset */
scr_read
(
ap
,
SCR_CONTROL
);
/* dummy read; flush */
udelay
(
400
);
/* FIXME: a guess */
scr_write
(
ap
,
SCR_CONTROL
,
0x300
);
/* issue phy wake/reset */
if
(
ap
->
flags
&
ATA_FLAG_SATA_RESET
)
{
scr_write
(
ap
,
SCR_CONTROL
,
0x301
);
/* issue phy wake/reset */
scr_read
(
ap
,
SCR_STATUS
);
/* dummy read; flush */
udelay
(
400
);
/* FIXME: a guess */
}
scr_write
(
ap
,
SCR_CONTROL
,
0x300
);
/* issue phy wake/clear reset */
/* wait for phy to become ready, if necessary */
do
{
...
...
@@ -1084,6 +1086,11 @@ void sata_phy_reset(struct ata_port *ap)
if
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
)
return
;
if
(
ata_busy_sleep
(
ap
,
ATA_TMOUT_BOOT_QUICK
,
ATA_TMOUT_BOOT
))
{
ata_port_disable
(
ap
);
return
;
}
ata_bus_reset
(
ap
);
}
...
...
@@ -1337,9 +1344,13 @@ void ata_bus_reset(struct ata_port *ap)
outb
(
ap
->
ctl
,
ioaddr
->
ctl_addr
);
/* determine if device 0/1 are present */
dev0
=
ata_dev_devchk
(
ap
,
0
);
if
(
slave_possible
)
dev1
=
ata_dev_devchk
(
ap
,
1
);
if
(
ap
->
flags
&
ATA_FLAG_SATA_RESET
)
dev0
=
1
;
else
{
dev0
=
ata_dev_devchk
(
ap
,
0
);
if
(
slave_possible
)
dev1
=
ata_dev_devchk
(
ap
,
1
);
}
if
(
dev0
)
devmask
|=
(
1
<<
0
);
...
...
@@ -2569,7 +2580,8 @@ static int ata_thread (void *data)
printk
(
KERN_DEBUG
"ata%u: thread exiting
\n
"
,
ap
->
id
);
ap
->
thr_pid
=
-
1
;
complete_and_exit
(
&
ap
->
thr_exited
,
0
);
del_timer_sync
(
&
ap
->
thr_timer
);
complete_and_exit
(
&
ap
->
thr_exited
,
0
);
}
/**
...
...
@@ -2664,6 +2676,26 @@ static void atapi_cdb_send(struct ata_port *ap)
goto
out
;
}
int
ata_port_start
(
struct
ata_port
*
ap
)
{
struct
pci_dev
*
pdev
=
ap
->
host_set
->
pdev
;
ap
->
prd
=
pci_alloc_consistent
(
pdev
,
ATA_PRD_TBL_SZ
,
&
ap
->
prd_dma
);
if
(
!
ap
->
prd
)
return
-
ENOMEM
;
DPRINTK
(
"prd alloc, virt %p, dma %x
\n
"
,
ap
->
prd
,
ap
->
prd_dma
);
return
0
;
}
void
ata_port_stop
(
struct
ata_port
*
ap
)
{
struct
pci_dev
*
pdev
=
ap
->
host_set
->
pdev
;
pci_free_consistent
(
pdev
,
ATA_PRD_TBL_SZ
,
ap
->
prd
,
ap
->
prd_dma
);
}
/**
* ata_host_remove -
* @ap:
...
...
@@ -2683,7 +2715,7 @@ static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister)
ata_thread_kill
(
ap
);
/* FIXME: check return val */
pci_free_consistent
(
ap
->
host_set
->
pdev
,
ATA_PRD_TBL_SZ
,
ap
->
prd
,
ap
->
prd_dma
);
ap
->
ops
->
port_stop
(
ap
);
}
/**
...
...
@@ -2764,9 +2796,9 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent,
struct
ata_host_set
*
host_set
,
unsigned
int
port_no
)
{
struct
pci_dev
*
pdev
=
ent
->
pdev
;
struct
Scsi_Host
*
host
;
struct
ata_port
*
ap
;
int
rc
;
DPRINTK
(
"ENTER
\n
"
);
host
=
scsi_host_alloc
(
ent
->
sht
,
sizeof
(
struct
ata_port
));
...
...
@@ -2777,10 +2809,9 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent,
ata_host_init
(
ap
,
host
,
host_set
,
ent
,
port_no
);
ap
->
prd
=
pci_alloc_consistent
(
pdev
,
ATA_PRD_TBL_SZ
,
&
ap
->
prd_dma
);
if
(
!
ap
->
prd
)
rc
=
ap
->
ops
->
port_start
(
ap
);
if
(
rc
)
goto
err_out
;
DPRINTK
(
"prd alloc, virt %p, dma %x
\n
"
,
ap
->
prd
,
ap
->
prd_dma
);
ap
->
thr_pid
=
kernel_thread
(
ata_thread
,
ap
,
CLONE_FS
|
CLONE_FILES
);
if
(
ap
->
thr_pid
<
0
)
{
...
...
@@ -2792,7 +2823,7 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent,
return
ap
;
err_out_free:
pci_free_consistent
(
ap
->
host_set
->
pdev
,
ATA_PRD_TBL_SZ
,
ap
->
prd
,
ap
->
prd_dma
);
ap
->
ops
->
port_stop
(
ap
);
err_out:
scsi_host_put
(
host
);
...
...
@@ -2828,6 +2859,7 @@ int ata_device_add(struct ata_probe_ent *ent)
host_set
->
n_ports
=
ent
->
n_ports
;
host_set
->
irq
=
ent
->
irq
;
host_set
->
mmio_base
=
ent
->
mmio_base
;
host_set
->
private_data
=
ent
->
private_data
;
/* register each port bound to this device */
for
(
i
=
0
;
i
<
ent
->
n_ports
;
i
++
)
{
...
...
@@ -3170,6 +3202,8 @@ void ata_pci_remove_one (struct pci_dev *pdev)
free_irq
(
host_set
->
irq
,
host_set
);
if
(
host_set
->
mmio_base
)
iounmap
(
host_set
->
mmio_base
);
if
(
host_set
->
ports
[
0
]
->
ops
->
host_stop
)
host_set
->
ports
[
0
]
->
ops
->
host_stop
(
host_set
);
for
(
i
=
0
;
i
<
host_set
->
n_ports
;
i
++
)
{
Scsi_Host_Template
*
sht
;
...
...
@@ -3274,6 +3308,8 @@ EXPORT_SYMBOL_GPL(ata_check_status_pio);
EXPORT_SYMBOL_GPL
(
ata_check_status_mmio
);
EXPORT_SYMBOL_GPL
(
ata_exec_command_pio
);
EXPORT_SYMBOL_GPL
(
ata_exec_command_mmio
);
EXPORT_SYMBOL_GPL
(
ata_port_start
);
EXPORT_SYMBOL_GPL
(
ata_port_stop
);
EXPORT_SYMBOL_GPL
(
ata_interrupt
);
EXPORT_SYMBOL_GPL
(
ata_fill_sg
);
EXPORT_SYMBOL_GPL
(
ata_bmdma_start_pio
);
...
...
drivers/scsi/osst_options.h
View file @
3ea7f245
...
...
@@ -57,7 +57,7 @@
/* The size of the first scatter/gather segments (determines the maximum block
size for SCSI adapters not supporting scatter/gather). The default is set
to try to allocate the buffer as one chunk. */
#define OSST_FIRST_ORDER
5
#define OSST_FIRST_ORDER
(15-PAGE_SHIFT)
/* The following lines define defaults for properties that can be set
...
...
drivers/scsi/sata_promise.c
View file @
3ea7f245
...
...
@@ -32,22 +32,46 @@
#include "scsi.h"
#include "hosts.h"
#include <linux/libata.h>
#include <asm/io.h>
#undef DIRECT_HDMA
#define DRV_NAME "sata_promise"
#define DRV_VERSION "0.8
3
"
#define DRV_VERSION "0.8
4
"
enum
{
PDC_PRD_TBL
=
0x44
,
/* Direct command DMA table addr */
PDC_PKT_SUBMIT
=
0x40
,
/* Command packet pointer addr */
PDC_HDMA_PKT_SUBMIT
=
0x100
,
/* Host DMA packet pointer addr */
PDC_INT_SEQMASK
=
0x40
,
/* Mask of asserted SEQ INTs */
PDC_TBG_MODE
=
0x41
,
/* TBG mode */
PDC_FLASH_CTL
=
0x44
,
/* Flash control register */
PDC_CTLSTAT
=
0x60
,
/* IDE control and status register */
PDC_SATA_PLUG_CSR
=
0x6C
,
/* SATA Plug control/status reg */
PDC_SLEW_CTL
=
0x470
,
/* slew rate control reg */
PDC_HDMA_CTLSTAT
=
0x12C
,
/* Host DMA control / status */
PDC_20621_SEQCTL
=
0x400
,
PDC_20621_SEQMASK
=
0x480
,
PDC_20621_PAGE_SIZE
=
(
32
*
1024
),
/* chosen, not constant, values; we design our own DIMM mem map */
PDC_20621_DIMM_WINDOW
=
0x0C
,
/* page# for 32K DIMM window */
PDC_20621_DIMM_BASE
=
0x00200000
,
PDC_20621_DIMM_DATA
=
(
64
*
1024
),
PDC_DIMM_DATA_STEP
=
(
256
*
1024
),
PDC_DIMM_WINDOW_STEP
=
(
8
*
1024
),
PDC_DIMM_HOST_PRD
=
(
6
*
1024
),
PDC_DIMM_HOST_PKT
=
(
128
*
0
),
PDC_DIMM_HPKT_PRD
=
(
128
*
1
),
PDC_DIMM_ATA_PKT
=
(
128
*
2
),
PDC_DIMM_APKT_PRD
=
(
128
*
3
),
PDC_DIMM_HEADER_SZ
=
PDC_DIMM_APKT_PRD
+
128
,
PDC_PAGE_WINDOW
=
0x40
,
PDC_PAGE_DATA
=
PDC_PAGE_WINDOW
+
(
PDC_20621_DIMM_DATA
/
PDC_20621_PAGE_SIZE
),
PDC_PAGE_SET
=
PDC_DIMM_DATA_STEP
/
PDC_20621_PAGE_SIZE
,
PDC_CHIP0_OFS
=
0xC0000
,
/* offset of chip #0 */
...
...
@@ -56,6 +80,14 @@ enum {
board_20621
=
2
,
/* FastTrak S150 SX4 */
PDC_FLAG_20621
=
(
1
<<
30
),
/* we have a 20621 */
PDC_HDMA_RESET
=
(
1
<<
11
),
/* HDMA reset */
};
struct
pdc_port_priv
{
u8
dimm_buf
[(
ATA_PRD_SZ
*
ATA_MAX_PRD
)
+
512
];
u8
*
pkt
;
dma_addr_t
pkt_dma
;
};
...
...
@@ -67,9 +99,20 @@ static void pdc_sata_set_udmamode (struct ata_port *ap, struct ata_device *adev,
unsigned
int
udma
);
static
int
pdc_sata_init_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
);
static
void
pdc_dma_start
(
struct
ata_queued_cmd
*
qc
);
static
void
pdc20621_dma_start
(
struct
ata_queued_cmd
*
qc
);
static
irqreturn_t
pdc_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
);
static
irqreturn_t
pdc20621_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
);
static
void
pdc_eng_timeout
(
struct
ata_port
*
ap
);
static
void
pdc_20621_phy_reset
(
struct
ata_port
*
ap
);
static
int
pdc_port_start
(
struct
ata_port
*
ap
);
static
void
pdc_port_stop
(
struct
ata_port
*
ap
);
static
void
pdc_fill_sg
(
struct
ata_queued_cmd
*
qc
);
static
void
pdc20621_fill_sg
(
struct
ata_queued_cmd
*
qc
);
static
void
pdc_tf_load_mmio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
);
static
void
pdc_exec_command_mmio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
);
static
void
pdc20621_host_stop
(
struct
ata_host_set
*
host_set
);
static
inline
void
pdc_dma_complete
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
);
static
Scsi_Host_Template
pdc_sata_sht
=
{
...
...
@@ -93,34 +136,39 @@ static struct ata_port_operations pdc_sata_ops = {
.
port_disable
=
ata_port_disable
,
.
set_piomode
=
pdc_sata_set_piomode
,
.
set_udmamode
=
pdc_sata_set_udmamode
,
.
tf_load
=
ata
_tf_load_mmio
,
.
tf_load
=
pdc
_tf_load_mmio
,
.
tf_read
=
ata_tf_read_mmio
,
.
check_status
=
ata_check_status_mmio
,
.
exec_command
=
ata
_exec_command_mmio
,
.
exec_command
=
pdc
_exec_command_mmio
,
.
phy_reset
=
sata_phy_reset
,
.
phy_config
=
pata_phy_config
,
/* not a typo */
.
bmdma_start
=
pdc_dma_start
,
.
fill_sg
=
ata
_fill_sg
,
.
fill_sg
=
pdc
_fill_sg
,
.
eng_timeout
=
pdc_eng_timeout
,
.
irq_handler
=
pdc_interrupt
,
.
scr_read
=
pdc_sata_scr_read
,
.
scr_write
=
pdc_sata_scr_write
,
.
port_start
=
pdc_port_start
,
.
port_stop
=
pdc_port_stop
,
};
static
struct
ata_port_operations
pdc_20621_ops
=
{
.
port_disable
=
ata_port_disable
,
.
set_piomode
=
pdc_sata_set_piomode
,
.
set_udmamode
=
pdc_sata_set_udmamode
,
.
tf_load
=
ata
_tf_load_mmio
,
.
tf_load
=
pdc
_tf_load_mmio
,
.
tf_read
=
ata_tf_read_mmio
,
.
check_status
=
ata_check_status_mmio
,
.
exec_command
=
ata
_exec_command_mmio
,
.
exec_command
=
pdc
_exec_command_mmio
,
.
phy_reset
=
pdc_20621_phy_reset
,
.
phy_config
=
pata_phy_config
,
/* not a typo */
.
bmdma_start
=
pdc_dma_start
,
.
fill_sg
=
ata
_fill_sg
,
.
bmdma_start
=
pdc
20621
_dma_start
,
.
fill_sg
=
pdc20621
_fill_sg
,
.
eng_timeout
=
pdc_eng_timeout
,
.
irq_handler
=
pdc_interrupt
,
.
irq_handler
=
pdc20621_interrupt
,
.
port_start
=
pdc_port_start
,
.
port_stop
=
pdc_port_stop
,
.
host_stop
=
pdc20621_host_stop
,
};
static
struct
ata_port_info
pdc_port_info
[]
=
{
...
...
@@ -160,16 +208,16 @@ static struct ata_port_info pdc_port_info[] = {
static
struct
pci_device_id
pdc_sata_pci_tbl
[]
=
{
{
PCI_VENDOR_ID_PROMISE
,
0x3371
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
board_2037x
},
{
PCI_VENDOR_ID_PROMISE
,
0x3373
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
board_2037x
},
{
PCI_VENDOR_ID_PROMISE
,
0x3375
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
board_2037x
},
{
PCI_VENDOR_ID_PROMISE
,
0x3318
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
board_20319
},
{
PCI_VENDOR_ID_PROMISE
,
0x3319
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
board_20319
},
#if 0 /* broken currently */
{
PCI_VENDOR_ID_PROMISE
,
0x6622
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
board_20621
},
#endif
{
}
/* terminate list */
};
...
...
@@ -182,6 +230,60 @@ static struct pci_driver pdc_sata_pci_driver = {
};
static
void
pdc20621_host_stop
(
struct
ata_host_set
*
host_set
)
{
void
*
mmio
=
host_set
->
private_data
;
assert
(
mmio
!=
NULL
);
iounmap
(
mmio
);
}
static
int
pdc_port_start
(
struct
ata_port
*
ap
)
{
struct
pci_dev
*
pdev
=
ap
->
host_set
->
pdev
;
struct
pdc_port_priv
*
pp
;
int
rc
;
rc
=
ata_port_start
(
ap
);
if
(
rc
)
return
rc
;
pp
=
kmalloc
(
sizeof
(
*
pp
),
GFP_KERNEL
);
if
(
!
pp
)
{
rc
=
-
ENOMEM
;
goto
err_out
;
}
pp
->
pkt
=
pci_alloc_consistent
(
pdev
,
128
,
&
pp
->
pkt_dma
);
if
(
!
pp
->
pkt
)
{
rc
=
-
ENOMEM
;
goto
err_out_kfree
;
}
ap
->
private_data
=
pp
;
return
0
;
err_out_kfree:
kfree
(
pp
);
err_out:
ata_port_stop
(
ap
);
return
rc
;
}
static
void
pdc_port_stop
(
struct
ata_port
*
ap
)
{
struct
pci_dev
*
pdev
=
ap
->
host_set
->
pdev
;
struct
pdc_port_priv
*
pp
=
ap
->
private_data
;
ap
->
private_data
=
NULL
;
pci_free_consistent
(
pdev
,
128
,
pp
->
pkt
,
pp
->
pkt_dma
);
kfree
(
pp
);
ata_port_stop
(
ap
);
}
static
void
pdc_20621_phy_reset
(
struct
ata_port
*
ap
)
{
VPRINTK
(
"ENTER
\n
"
);
...
...
@@ -231,8 +333,9 @@ enum pdc_packet_bits {
PDC_REG_DEVCTL
=
(
1
<<
3
)
|
(
1
<<
2
)
|
(
1
<<
1
),
};
static
inline
void
pdc_pkt_header
(
struct
ata_taskfile
*
tf
,
dma_addr_t
sg_table
,
unsigned
int
devno
,
u8
*
buf
)
static
inline
unsigned
int
pdc_pkt_header
(
struct
ata_taskfile
*
tf
,
dma_addr_t
sg_table
,
unsigned
int
devno
,
u8
*
buf
)
{
u8
dev_reg
;
u32
*
buf32
=
(
u32
*
)
buf
;
...
...
@@ -273,9 +376,11 @@ static inline void pdc_pkt_header(struct ata_taskfile *tf, dma_addr_t sg_table,
/* device control register */
buf
[
14
]
=
(
1
<<
5
)
|
PDC_REG_DEVCTL
;
buf
[
15
]
=
tf
->
ctl
;
return
16
;
/* offset of next byte */
}
static
inline
void
pdc_pkt_footer
(
struct
ata_taskfile
*
tf
,
u8
*
buf
,
static
inline
unsigned
int
pdc_pkt_footer
(
struct
ata_taskfile
*
tf
,
u8
*
buf
,
unsigned
int
i
)
{
if
(
tf
->
flags
&
ATA_TFLAG_DEVICE
)
{
...
...
@@ -286,19 +391,14 @@ static inline void pdc_pkt_footer(struct ata_taskfile *tf, u8 *buf,
/* and finally the command itself; also includes end-of-pkt marker */
buf
[
i
++
]
=
(
1
<<
5
)
|
PDC_LAST_REG
|
ATA_REG_CMD
;
buf
[
i
++
]
=
tf
->
command
;
return
i
;
}
static
void
pdc_prep_lba28
(
struct
ata_taskfile
*
tf
,
dma_addr_t
sg_table
,
unsigned
int
devno
,
u8
*
buf
)
static
inline
unsigned
int
pdc_prep_lba28
(
struct
ata_taskfile
*
tf
,
u8
*
buf
,
unsigned
int
i
)
{
unsigned
int
i
;
pdc_pkt_header
(
tf
,
sg_table
,
devno
,
buf
);
/* the "(1 << 5)" should be read "(count << 5)" */
i
=
16
;
/* ATA command block registers */
buf
[
i
++
]
=
(
1
<<
5
)
|
ATA_REG_FEATURE
;
buf
[
i
++
]
=
tf
->
feature
;
...
...
@@ -315,20 +415,13 @@ static void pdc_prep_lba28(struct ata_taskfile *tf, dma_addr_t sg_table,
buf
[
i
++
]
=
(
1
<<
5
)
|
ATA_REG_LBAH
;
buf
[
i
++
]
=
tf
->
lbah
;
pdc_pkt_footer
(
tf
,
buf
,
i
)
;
return
i
;
}
static
void
pdc_prep_lba48
(
struct
ata_taskfile
*
tf
,
dma_addr_t
sg_table
,
unsigned
int
devno
,
u8
*
buf
)
static
inline
unsigned
int
pdc_prep_lba48
(
struct
ata_taskfile
*
tf
,
u8
*
buf
,
unsigned
int
i
)
{
unsigned
int
i
;
pdc_pkt_header
(
tf
,
sg_table
,
devno
,
buf
);
/* the "(2 << 5)" should be read "(count << 5)" */
i
=
16
;
/* ATA command block registers */
buf
[
i
++
]
=
(
2
<<
5
)
|
ATA_REG_FEATURE
;
buf
[
i
++
]
=
tf
->
hob_feature
;
...
...
@@ -350,28 +443,461 @@ static void pdc_prep_lba48(struct ata_taskfile *tf, dma_addr_t sg_table,
buf
[
i
++
]
=
tf
->
hob_lbah
;
buf
[
i
++
]
=
tf
->
lbah
;
pdc_pkt_footer
(
tf
,
buf
,
i
)
;
return
i
;
}
static
inline
void
__pdc_dma_complete
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
)
static
inline
void
pdc20621_ata_sg
(
struct
ata_taskfile
*
tf
,
u8
*
buf
,
unsigned
int
portno
,
unsigned
int
total_len
)
{
void
*
dmactl
=
(
void
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_CTLSTAT
;
u32
val
;
u32
addr
;
unsigned
int
dw
=
PDC_DIMM_APKT_PRD
>>
2
;
u32
*
buf32
=
(
u32
*
)
buf
;
/* output ATA packet S/G table */
addr
=
PDC_20621_DIMM_BASE
+
PDC_20621_DIMM_DATA
+
(
PDC_DIMM_DATA_STEP
*
portno
);
VPRINTK
(
"ATA sg addr 0x%x, %d
\n
"
,
addr
,
addr
);
buf32
[
dw
]
=
cpu_to_le32
(
addr
);
buf32
[
dw
+
1
]
=
cpu_to_le32
(
total_len
|
ATA_PRD_EOT
);
VPRINTK
(
"ATA PSG @ %x == (0x%x, 0x%x)
\n
"
,
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
portno
)
+
PDC_DIMM_APKT_PRD
,
buf32
[
dw
],
buf32
[
dw
+
1
]);
}
static
inline
void
pdc20621_host_sg
(
struct
ata_taskfile
*
tf
,
u8
*
buf
,
unsigned
int
portno
,
unsigned
int
total_len
)
{
u32
addr
;
unsigned
int
dw
=
PDC_DIMM_HPKT_PRD
>>
2
;
u32
*
buf32
=
(
u32
*
)
buf
;
/*
clear DMA start/stop bit (bit 7)
*/
val
=
readl
(
dmactl
);
writel
(
val
&
~
(
1
<<
7
),
dmactl
);
/*
output Host DMA packet S/G table
*/
addr
=
PDC_20621_DIMM_BASE
+
PDC_20621_DIMM_DATA
+
(
PDC_DIMM_DATA_STEP
*
portno
);
/* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
ata_altstatus
(
ap
);
/* dummy read */
buf32
[
dw
]
=
cpu_to_le32
(
addr
);
buf32
[
dw
+
1
]
=
cpu_to_le32
(
total_len
|
ATA_PRD_EOT
);
VPRINTK
(
"HOST PSG @ %x == (0x%x, 0x%x)
\n
"
,
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
portno
)
+
PDC_DIMM_HPKT_PRD
,
buf32
[
dw
],
buf32
[
dw
+
1
]);
}
static
inline
unsigned
int
pdc20621_ata_pkt
(
struct
ata_taskfile
*
tf
,
unsigned
int
devno
,
u8
*
buf
,
unsigned
int
portno
)
{
unsigned
int
i
,
dw
;
u32
*
buf32
=
(
u32
*
)
buf
;
u8
dev_reg
;
unsigned
int
dimm_sg
=
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
portno
)
+
PDC_DIMM_APKT_PRD
;
VPRINTK
(
"ENTER, dimm_sg == 0x%x, %d
\n
"
,
dimm_sg
,
dimm_sg
);
i
=
PDC_DIMM_ATA_PKT
;
/*
* Set up ATA packet
*/
if
(
tf
->
protocol
==
ATA_PROT_DMA_READ
)
buf
[
i
++
]
=
PDC_PKT_READ
;
else
if
(
tf
->
protocol
==
ATA_PROT_NODATA
)
buf
[
i
++
]
=
PDC_PKT_NODATA
;
else
buf
[
i
++
]
=
0
;
buf
[
i
++
]
=
0
;
/* reserved */
buf
[
i
++
]
=
portno
+
1
;
/* seq. id */
buf
[
i
++
]
=
0xff
;
/* delay seq. id */
/* dimm dma S/G, and next-pkt */
dw
=
i
>>
2
;
buf32
[
dw
]
=
cpu_to_le32
(
dimm_sg
);
buf32
[
dw
+
1
]
=
0
;
i
+=
8
;
if
(
devno
==
0
)
dev_reg
=
ATA_DEVICE_OBS
;
else
dev_reg
=
ATA_DEVICE_OBS
|
ATA_DEV1
;
/* select device */
buf
[
i
++
]
=
(
1
<<
5
)
|
PDC_PKT_CLEAR_BSY
|
ATA_REG_DEVICE
;
buf
[
i
++
]
=
dev_reg
;
/* device control register */
buf
[
i
++
]
=
(
1
<<
5
)
|
PDC_REG_DEVCTL
;
buf
[
i
++
]
=
tf
->
ctl
;
return
i
;
}
static
inline
void
pdc20621_host_pkt
(
struct
ata_taskfile
*
tf
,
u8
*
buf
,
unsigned
int
portno
)
{
unsigned
int
dw
;
u32
tmp
,
*
buf32
=
(
u32
*
)
buf
;
unsigned
int
host_sg
=
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
portno
)
+
PDC_DIMM_HOST_PRD
;
unsigned
int
dimm_sg
=
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
portno
)
+
PDC_DIMM_HPKT_PRD
;
VPRINTK
(
"ENTER, dimm_sg == 0x%x, %d
\n
"
,
dimm_sg
,
dimm_sg
);
VPRINTK
(
"host_sg == 0x%x, %d
\n
"
,
host_sg
,
host_sg
);
dw
=
PDC_DIMM_HOST_PKT
>>
2
;
/*
* Set up Host DMA packet
*/
if
(
tf
->
protocol
==
ATA_PROT_DMA_READ
)
tmp
=
PDC_PKT_READ
;
else
tmp
=
0
;
tmp
|=
((
portno
+
1
+
4
)
<<
16
);
/* seq. id */
tmp
|=
(
0xff
<<
24
);
/* delay seq. id */
buf32
[
dw
+
0
]
=
cpu_to_le32
(
tmp
);
buf32
[
dw
+
1
]
=
cpu_to_le32
(
host_sg
);
buf32
[
dw
+
2
]
=
cpu_to_le32
(
dimm_sg
);
buf32
[
dw
+
3
]
=
0
;
VPRINTK
(
"HOST PKT @ %x == (0x%x 0x%x 0x%x 0x%x)
\n
"
,
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
portno
)
+
PDC_DIMM_HOST_PKT
,
buf32
[
dw
+
0
],
buf32
[
dw
+
1
],
buf32
[
dw
+
2
],
buf32
[
dw
+
3
]);
}
static
void
pdc20621_fill_sg
(
struct
ata_queued_cmd
*
qc
)
{
struct
scatterlist
*
sg
=
qc
->
sg
;
struct
ata_port
*
ap
=
qc
->
ap
;
struct
pdc_port_priv
*
pp
=
ap
->
private_data
;
void
*
dimm_mmio
=
ap
->
host_set
->
private_data
;
unsigned
int
portno
=
ap
->
port_no
;
unsigned
int
i
,
last
,
idx
,
total_len
=
0
,
sgt_len
;
u32
*
buf
=
(
u32
*
)
&
pp
->
dimm_buf
[
PDC_DIMM_HEADER_SZ
];
VPRINTK
(
"ata%u: ENTER
\n
"
,
ap
->
id
);
/*
* Build S/G table
*/
last
=
qc
->
n_elem
;
idx
=
0
;
for
(
i
=
0
;
i
<
last
;
i
++
)
{
buf
[
idx
++
]
=
cpu_to_le32
(
sg
[
i
].
dma_address
);
buf
[
idx
++
]
=
cpu_to_le32
(
sg
[
i
].
length
);
total_len
+=
sg
[
i
].
length
;
}
buf
[
idx
-
1
]
|=
cpu_to_le32
(
ATA_PRD_EOT
);
sgt_len
=
idx
*
4
;
/*
* Build ATA, host DMA packets
*/
pdc20621_host_sg
(
&
qc
->
tf
,
&
pp
->
dimm_buf
[
0
],
portno
,
total_len
);
pdc20621_host_pkt
(
&
qc
->
tf
,
&
pp
->
dimm_buf
[
0
],
portno
);
pdc20621_ata_sg
(
&
qc
->
tf
,
&
pp
->
dimm_buf
[
0
],
portno
,
total_len
);
i
=
pdc20621_ata_pkt
(
&
qc
->
tf
,
qc
->
dev
->
devno
,
&
pp
->
dimm_buf
[
0
],
portno
);
if
(
qc
->
tf
.
flags
&
ATA_TFLAG_LBA48
)
i
=
pdc_prep_lba48
(
&
qc
->
tf
,
&
pp
->
dimm_buf
[
0
],
i
);
else
i
=
pdc_prep_lba28
(
&
qc
->
tf
,
&
pp
->
dimm_buf
[
0
],
i
);
pdc_pkt_footer
(
&
qc
->
tf
,
&
pp
->
dimm_buf
[
0
],
i
);
/* copy three S/G tables and two packets to DIMM MMIO window */
memcpy_toio
(
dimm_mmio
+
(
portno
*
PDC_DIMM_WINDOW_STEP
),
&
pp
->
dimm_buf
,
PDC_DIMM_HEADER_SZ
);
memcpy_toio
(
dimm_mmio
+
(
portno
*
PDC_DIMM_WINDOW_STEP
)
+
PDC_DIMM_HOST_PRD
,
&
pp
->
dimm_buf
[
PDC_DIMM_HEADER_SZ
],
sgt_len
);
VPRINTK
(
"ata pkt buf ofs %u, prd size %u, mmio copied
\n
"
,
i
,
sgt_len
);
}
#ifdef DIRECT_HDMA
static
void
pdc20621_push_hdma
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
ata_host_set
*
host_set
=
ap
->
host_set
;
unsigned
int
port_no
=
ap
->
port_no
;
void
*
mmio
=
host_set
->
mmio_base
;
unsigned
int
rw
=
(
qc
->
flags
&
ATA_QCFLAG_WRITE
);
u32
tmp
;
unsigned
int
host_sg
=
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
port_no
)
+
PDC_DIMM_HOST_PRD
;
unsigned
int
dimm_sg
=
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
port_no
)
+
PDC_DIMM_HPKT_PRD
;
/* hard-code chip #0 */
mmio
+=
PDC_CHIP0_OFS
;
tmp
=
readl
(
mmio
+
PDC_HDMA_CTLSTAT
)
&
0xffffff00
;
tmp
|=
port_no
+
1
+
4
;
/* seq. ID */
if
(
!
rw
)
tmp
|=
(
1
<<
6
);
/* hdma data direction */
writel
(
tmp
,
mmio
+
PDC_HDMA_CTLSTAT
);
/* note: stops DMA, if active */
readl
(
mmio
+
PDC_HDMA_CTLSTAT
);
/* flush */
writel
(
host_sg
,
mmio
+
0x108
);
writel
(
dimm_sg
,
mmio
+
0x10C
);
writel
(
0
,
mmio
+
0x128
);
tmp
|=
(
1
<<
7
);
writel
(
tmp
,
mmio
+
PDC_HDMA_CTLSTAT
);
readl
(
mmio
+
PDC_HDMA_CTLSTAT
);
/* flush */
}
#endif
#ifdef ATA_VERBOSE_DEBUG
static
void
pdc20621_dump_hdma
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
unsigned
int
port_no
=
ap
->
port_no
;
void
*
dimm_mmio
=
ap
->
host_set
->
private_data
;
dimm_mmio
+=
(
port_no
*
PDC_DIMM_WINDOW_STEP
);
dimm_mmio
+=
PDC_DIMM_HOST_PKT
;
printk
(
KERN_ERR
"HDMA[0] == 0x%08X
\n
"
,
readl
(
dimm_mmio
));
printk
(
KERN_ERR
"HDMA[1] == 0x%08X
\n
"
,
readl
(
dimm_mmio
+
4
));
printk
(
KERN_ERR
"HDMA[2] == 0x%08X
\n
"
,
readl
(
dimm_mmio
+
8
));
printk
(
KERN_ERR
"HDMA[3] == 0x%08X
\n
"
,
readl
(
dimm_mmio
+
12
));
}
#else
static
inline
void
pdc20621_dump_hdma
(
struct
ata_queued_cmd
*
qc
)
{
}
#endif
/* ATA_VERBOSE_DEBUG */
static
void
pdc20621_dma_start
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
ata_host_set
*
host_set
=
ap
->
host_set
;
unsigned
int
port_no
=
ap
->
port_no
;
void
*
mmio
=
host_set
->
mmio_base
;
unsigned
int
rw
=
(
qc
->
flags
&
ATA_QCFLAG_WRITE
);
u8
seq
=
(
u8
)
(
port_no
+
1
);
unsigned
int
doing_hdma
=
0
,
port_ofs
;
/* hard-code chip #0 */
mmio
+=
PDC_CHIP0_OFS
;
VPRINTK
(
"ata%u: ENTER
\n
"
,
ap
->
id
);
port_ofs
=
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
port_no
);
/* if writing, we (1) DMA to DIMM, then (2) do ATA command */
if
(
rw
)
{
doing_hdma
=
1
;
seq
+=
4
;
}
wmb
();
/* flush PRD, pkt writes */
writel
(
0x00000001
,
mmio
+
PDC_20621_SEQCTL
+
(
seq
*
4
));
if
(
doing_hdma
)
{
pdc20621_dump_hdma
(
qc
);
#ifdef DIRECT_HDMA
pdc20621_push_hdma
(
qc
);
#else
writel
(
port_ofs
+
PDC_DIMM_HOST_PKT
,
mmio
+
PDC_HDMA_PKT_SUBMIT
);
#endif
VPRINTK
(
"submitted ofs 0x%x (%u), seq %u
\n
"
,
port_ofs
+
PDC_DIMM_HOST_PKT
,
port_ofs
+
PDC_DIMM_HOST_PKT
,
seq
);
}
else
{
writel
(
port_ofs
+
PDC_DIMM_ATA_PKT
,
(
void
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_PKT_SUBMIT
);
VPRINTK
(
"submitted ofs 0x%x (%u), seq %u
\n
"
,
port_ofs
+
PDC_DIMM_ATA_PKT
,
port_ofs
+
PDC_DIMM_ATA_PKT
,
seq
);
}
}
static
inline
unsigned
int
pdc20621_host_intr
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
,
unsigned
int
doing_hdma
,
void
*
mmio
)
{
unsigned
int
port_no
=
ap
->
port_no
;
unsigned
int
port_ofs
=
PDC_20621_DIMM_BASE
+
(
PDC_DIMM_WINDOW_STEP
*
port_no
);
u8
status
;
unsigned
int
handled
=
0
;
VPRINTK
(
"ENTER
\n
"
);
switch
(
qc
->
tf
.
protocol
)
{
case
ATA_PROT_DMA_READ
:
/* step two - DMA from DIMM to host */
if
(
doing_hdma
)
{
VPRINTK
(
"ata%u: read hdma, 0x%x 0x%x
\n
"
,
ap
->
id
,
readl
(
mmio
+
0x104
),
readl
(
mmio
+
PDC_HDMA_CTLSTAT
));
pdc_dma_complete
(
ap
,
qc
);
}
/* step one - exec ATA command */
else
{
u8
seq
=
(
u8
)
(
port_no
+
1
+
4
);
VPRINTK
(
"ata%u: read ata, 0x%x 0x%x
\n
"
,
ap
->
id
,
readl
(
mmio
+
0x104
),
readl
(
mmio
+
PDC_HDMA_CTLSTAT
));
/* submit hdma pkt */
pdc20621_dump_hdma
(
qc
);
writel
(
0x00000001
,
mmio
+
PDC_20621_SEQCTL
+
(
seq
*
4
));
#ifdef DIRECT_HDMA
pdc20621_push_hdma
(
qc
);
#else
writel
(
port_ofs
+
PDC_DIMM_HOST_PKT
,
mmio
+
PDC_HDMA_PKT_SUBMIT
);
#endif
}
handled
=
1
;
break
;
case
ATA_PROT_DMA_WRITE
:
/* step one - DMA from host to DIMM */
if
(
doing_hdma
)
{
u8
seq
=
(
u8
)
(
port_no
+
1
);
VPRINTK
(
"ata%u: write hdma, 0x%x 0x%x
\n
"
,
ap
->
id
,
readl
(
mmio
+
0x104
),
readl
(
mmio
+
PDC_HDMA_CTLSTAT
));
/* submit ata pkt */
writel
(
0x00000001
,
mmio
+
PDC_20621_SEQCTL
+
(
seq
*
4
));
writel
(
port_ofs
+
PDC_DIMM_ATA_PKT
,
(
void
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_PKT_SUBMIT
);
}
/* step two - execute ATA command */
else
{
VPRINTK
(
"ata%u: write ata, 0x%x 0x%x
\n
"
,
ap
->
id
,
readl
(
mmio
+
0x104
),
readl
(
mmio
+
PDC_HDMA_CTLSTAT
));
pdc_dma_complete
(
ap
,
qc
);
}
handled
=
1
;
break
;
case
ATA_PROT_NODATA
:
/* command completion, but no data xfer */
status
=
ata_busy_wait
(
ap
,
ATA_BUSY
|
ATA_DRQ
,
1000
);
DPRINTK
(
"BUS_NODATA (drv_stat 0x%X)
\n
"
,
status
);
ata_qc_complete
(
qc
,
status
,
0
);
handled
=
1
;
break
;
default:
ap
->
stats
.
idle_irq
++
;
break
;
}
return
handled
;
}
static
irqreturn_t
pdc20621_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
)
{
struct
ata_host_set
*
host_set
=
dev_instance
;
struct
ata_port
*
ap
;
u32
mask
=
0
;
unsigned
int
i
,
tmp
,
port_no
;
unsigned
int
handled
=
0
;
void
*
mmio_base
;
VPRINTK
(
"ENTER
\n
"
);
if
(
!
host_set
||
!
host_set
->
mmio_base
)
{
VPRINTK
(
"QUICK EXIT
\n
"
);
return
IRQ_NONE
;
}
mmio_base
=
host_set
->
mmio_base
;
/* reading should also clear interrupts */
mmio_base
+=
PDC_CHIP0_OFS
;
mask
=
readl
(
mmio_base
+
PDC_20621_SEQMASK
);
VPRINTK
(
"mask == 0x%x
\n
"
,
mask
);
if
(
mask
==
0xffffffff
)
{
VPRINTK
(
"QUICK EXIT 2
\n
"
);
return
IRQ_NONE
;
}
mask
&=
0xf
;
/* only 16 tags possible */
if
(
!
mask
)
{
VPRINTK
(
"QUICK EXIT 3
\n
"
);
return
IRQ_NONE
;
}
spin_lock_irq
(
&
host_set
->
lock
);
for
(
i
=
1
;
i
<
9
;
i
++
)
{
port_no
=
i
-
1
;
if
(
port_no
>
3
)
port_no
-=
4
;
if
(
port_no
>=
host_set
->
n_ports
)
ap
=
NULL
;
else
ap
=
host_set
->
ports
[
port_no
];
tmp
=
mask
&
(
1
<<
i
);
VPRINTK
(
"seq %u, port_no %u, ap %p, tmp %x
\n
"
,
i
,
port_no
,
ap
,
tmp
);
if
(
tmp
&&
ap
&&
(
!
(
ap
->
flags
&
ATA_FLAG_PORT_DISABLED
)))
{
struct
ata_queued_cmd
*
qc
;
qc
=
ata_qc_from_tag
(
ap
,
ap
->
active_tag
);
if
(
qc
&&
((
qc
->
flags
&
ATA_QCFLAG_POLL
)
==
0
))
handled
+=
pdc20621_host_intr
(
ap
,
qc
,
(
i
>
4
),
mmio_base
);
}
}
spin_unlock_irq
(
&
host_set
->
lock
);
VPRINTK
(
"mask == 0x%x
\n
"
,
mask
);
VPRINTK
(
"EXIT
\n
"
);
return
IRQ_RETVAL
(
handled
);
}
static
void
pdc_fill_sg
(
struct
ata_queued_cmd
*
qc
)
{
struct
pdc_port_priv
*
pp
=
qc
->
ap
->
private_data
;
unsigned
int
i
;
VPRINTK
(
"ENTER
\n
"
);
ata_fill_sg
(
qc
);
i
=
pdc_pkt_header
(
&
qc
->
tf
,
qc
->
ap
->
prd_dma
,
qc
->
dev
->
devno
,
pp
->
pkt
);
if
(
qc
->
tf
.
flags
&
ATA_TFLAG_LBA48
)
i
=
pdc_prep_lba48
(
&
qc
->
tf
,
pp
->
pkt
,
i
);
else
i
=
pdc_prep_lba28
(
&
qc
->
tf
,
pp
->
pkt
,
i
);
pdc_pkt_footer
(
&
qc
->
tf
,
pp
->
pkt
,
i
);
}
static
inline
void
pdc_dma_complete
(
struct
ata_port
*
ap
,
struct
ata_queued_cmd
*
qc
)
{
__pdc_dma_complete
(
ap
,
qc
);
/* get drive status; clear intr; complete txn */
ata_qc_complete
(
ata_qc_from_tag
(
ap
,
ap
->
active_tag
),
ata_wait_idle
(
ap
),
0
);
...
...
@@ -395,7 +921,6 @@ static void pdc_eng_timeout(struct ata_port *ap)
case
ATA_PROT_DMA_READ
:
case
ATA_PROT_DMA_WRITE
:
printk
(
KERN_ERR
"ata%u: DMA timeout
\n
"
,
ap
->
id
);
__pdc_dma_complete
(
ap
,
qc
);
ata_qc_complete
(
ata_qc_from_tag
(
ap
,
ap
->
active_tag
),
ata_wait_idle
(
ap
)
|
ATA_ERR
,
0
);
break
;
...
...
@@ -457,7 +982,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
struct
ata_port
*
ap
;
u32
mask
=
0
;
unsigned
int
i
,
tmp
;
unsigned
int
handled
=
0
,
have_20621
=
0
;
unsigned
int
handled
=
0
;
void
*
mmio_base
;
VPRINTK
(
"ENTER
\n
"
);
...
...
@@ -469,21 +994,8 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
mmio_base
=
host_set
->
mmio_base
;
for
(
i
=
0
;
i
<
host_set
->
n_ports
;
i
++
)
{
ap
=
host_set
->
ports
[
i
];
if
(
ap
&&
(
ap
->
flags
&
PDC_FLAG_20621
))
{
have_20621
=
1
;
break
;
}
}
/* reading should also clear interrupts */
if
(
have_20621
)
{
mmio_base
+=
PDC_CHIP0_OFS
;
mask
=
readl
(
mmio_base
+
PDC_20621_SEQMASK
);
}
else
{
mask
=
readl
(
mmio_base
+
PDC_INT_SEQMASK
);
}
mask
=
readl
(
mmio_base
+
PDC_INT_SEQMASK
);
if
(
mask
==
0xffffffff
)
{
VPRINTK
(
"QUICK EXIT 2
\n
"
);
...
...
@@ -520,56 +1032,35 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
static
void
pdc_dma_start
(
struct
ata_queued_cmd
*
qc
)
{
struct
ata_port
*
ap
=
qc
->
ap
;
struct
ata_host_set
*
host_set
=
ap
->
host_set
;
struct
pdc_port_priv
*
pp
=
ap
->
private_data
;
unsigned
int
port_no
=
ap
->
port_no
;
void
*
mmio
=
host_set
->
mmio_base
;
void
*
dmactl
=
(
void
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_CTLSTAT
;
unsigned
int
rw
=
(
qc
->
flags
&
ATA_QCFLAG_WRITE
);
u32
val
;
u8
seq
=
(
u8
)
(
port_no
+
1
);
wmb
();
/* flush writes made to PRD table in DMA memory */
VPRINTK
(
"ENTER, ap %p
\n
"
,
ap
);
if
(
ap
->
flags
&
PDC_FLAG_20621
)
mmio
+=
PDC_CHIP0_OFS
;
writel
(
0x00000001
,
ap
->
host_set
->
mmio_base
+
(
seq
*
4
));
VPRINTK
(
"ENTER, ap %p, mmio %p
\n
"
,
ap
,
mmio
);
/* indicate where our S/G table is to chip */
writel
(
ap
->
prd_dma
,
(
void
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_PRD_TBL
);
/* clear dma start bit (paranoia), clear intr seq id (paranoia),
* set DMA direction (bit 6 == from chip -> drive)
*/
val
=
readl
(
dmactl
);
VPRINTK
(
"val == %x
\n
"
,
val
);
val
&=
~
(
1
<<
7
);
/* clear dma start/stop bit */
if
(
rw
)
/* set/clear dma direction bit */
val
|=
(
1
<<
6
);
else
val
&=
~
(
1
<<
6
);
if
(
qc
->
tf
.
ctl
&
ATA_NIEN
)
/* set/clear irq-mask bit */
val
|=
(
1
<<
10
);
else
val
&=
~
(
1
<<
10
);
writel
(
val
,
dmactl
);
val
=
readl
(
dmactl
);
VPRINTK
(
"val == %x
\n
"
,
val
);
pp
->
pkt
[
2
]
=
seq
;
wmb
();
/* flush PRD, pkt writes */
writel
(
pp
->
pkt_dma
,
(
void
*
)
ap
->
ioaddr
.
cmd_addr
+
PDC_PKT_SUBMIT
);
}
/* FIXME: clear any intr status bits here? */
static
void
pdc_tf_load_mmio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
)
{
if
((
tf
->
protocol
!=
ATA_PROT_DMA_READ
)
&&
(
tf
->
protocol
!=
ATA_PROT_DMA_WRITE
))
ata_tf_load_mmio
(
ap
,
tf
);
}
ata_exec_command_mmio
(
ap
,
&
qc
->
tf
);
VPRINTK
(
"FIVE
\n
"
);
if
(
ap
->
flags
&
PDC_FLAG_20621
)
writel
(
0x00000001
,
mmio
+
PDC_20621_SEQCTL
+
(
seq
*
4
));
else
writel
(
0x00000001
,
mmio
+
(
seq
*
4
));
/* start host DMA transaction */
writel
(
val
|
seq
|
(
1
<<
7
),
dmactl
);
static
void
pdc_exec_command_mmio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
)
{
if
((
tf
->
protocol
!=
ATA_PROT_DMA_READ
)
&&
(
tf
->
protocol
!=
ATA_PROT_DMA_WRITE
))
ata_exec_command_mmio
(
ap
,
tf
);
}
static
void
pdc_sata_setup_port
(
struct
ata_ioports
*
port
,
unsigned
long
base
)
{
port
->
cmd_addr
=
base
;
...
...
@@ -586,6 +1077,32 @@ static void pdc_sata_setup_port(struct ata_ioports *port, unsigned long base)
static
void
pdc_20621_init
(
struct
ata_probe_ent
*
pe
)
{
u32
tmp
;
void
*
mmio
=
pe
->
mmio_base
;
mmio
+=
PDC_CHIP0_OFS
;
/*
* Select page 0x40 for our 32k DIMM window
*/
tmp
=
readl
(
mmio
+
PDC_20621_DIMM_WINDOW
)
&
0xffff0000
;
tmp
|=
PDC_PAGE_WINDOW
;
/* page 40h; arbitrarily selected */
writel
(
tmp
,
mmio
+
PDC_20621_DIMM_WINDOW
);
/*
* Reset Host DMA
*/
tmp
=
readl
(
mmio
+
PDC_HDMA_CTLSTAT
);
tmp
|=
PDC_HDMA_RESET
;
writel
(
tmp
,
mmio
+
PDC_HDMA_CTLSTAT
);
readl
(
mmio
+
PDC_HDMA_CTLSTAT
);
/* flush */
udelay
(
10
);
tmp
=
readl
(
mmio
+
PDC_HDMA_CTLSTAT
);
tmp
&=
~
PDC_HDMA_RESET
;
writel
(
tmp
,
mmio
+
PDC_HDMA_CTLSTAT
);
readl
(
mmio
+
PDC_HDMA_CTLSTAT
);
/* flush */
}
static
void
pdc_host_init
(
unsigned
int
chip_id
,
struct
ata_probe_ent
*
pe
)
...
...
@@ -629,8 +1146,9 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
static
int
printed_version
;
struct
ata_probe_ent
*
probe_ent
=
NULL
;
unsigned
long
base
;
void
*
mmio_base
;
void
*
mmio_base
,
*
dimm_mmio
=
NULL
;
unsigned
int
board_idx
=
(
unsigned
int
)
ent
->
driver_data
;
unsigned
int
have_20621
=
(
board_idx
==
board_20621
);
int
rc
;
if
(
!
printed_version
++
)
...
...
@@ -670,6 +1188,15 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
}
base
=
(
unsigned
long
)
mmio_base
;
if
(
have_20621
)
{
dimm_mmio
=
ioremap
(
pci_resource_start
(
pdev
,
4
),
pci_resource_len
(
pdev
,
4
));
if
(
!
dimm_mmio
)
{
rc
=
-
ENOMEM
;
goto
err_out_iounmap
;
}
}
probe_ent
->
sht
=
pdc_port_info
[
board_idx
].
sht
;
probe_ent
->
host_flags
=
pdc_port_info
[
board_idx
].
host_flags
;
probe_ent
->
pio_mask
=
pdc_port_info
[
board_idx
].
pio_mask
;
...
...
@@ -680,8 +1207,10 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
probe_ent
->
irq_flags
=
SA_SHIRQ
;
probe_ent
->
mmio_base
=
mmio_base
;
if
(
board_idx
==
board_20621
)
if
(
have_20621
)
{
probe_ent
->
private_data
=
dimm_mmio
;
base
+=
PDC_CHIP0_OFS
;
}
pdc_sata_setup_port
(
&
probe_ent
->
port
[
0
],
base
+
0x200
);
probe_ent
->
port
[
0
].
scr_addr
=
base
+
0x400
;
...
...
@@ -712,15 +1241,10 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
pci_set_master
(
pdev
);
/* initialize adapter */
switch
(
board_idx
)
{
case
board_20621
:
if
(
have_20621
)
pdc_20621_init
(
probe_ent
);
break
;
default:
else
pdc_host_init
(
board_idx
,
probe_ent
);
break
;
}
/* FIXME: check ata_device_add return value */
ata_device_add
(
probe_ent
);
...
...
@@ -728,6 +1252,8 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
return
0
;
err_out_iounmap:
iounmap
(
mmio_base
);
err_out_free_ent:
kfree
(
probe_ent
);
err_out_regions:
...
...
@@ -738,7 +1264,6 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
}
static
int
__init
pdc_sata_init
(
void
)
{
int
rc
;
...
...
drivers/scsi/sata_sil.c
View file @
3ea7f245
...
...
@@ -106,6 +106,8 @@ static struct ata_port_operations sil_ops = {
.
irq_handler
=
ata_interrupt
,
.
scr_read
=
sil_scr_read
,
.
scr_write
=
sil_scr_write
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
};
static
struct
ata_port_info
sil_port_info
[]
=
{
...
...
drivers/scsi/sata_svw.c
View file @
3ea7f245
...
...
@@ -235,6 +235,8 @@ static struct ata_port_operations k2_sata_ops = {
.
irq_handler
=
ata_interrupt
,
.
scr_read
=
k2_sata_scr_read
,
.
scr_write
=
k2_sata_scr_write
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
};
...
...
drivers/scsi/sata_via.c
View file @
3ea7f245
...
...
@@ -98,6 +98,9 @@ static struct ata_port_operations svia_sata_ops = {
.
eng_timeout
=
ata_eng_timeout
,
.
irq_handler
=
ata_interrupt
,
.
port_start
=
ata_port_start
,
.
port_stop
=
ata_port_stop
,
};
static
struct
ata_port_info
svia_port_info
[]
=
{
...
...
fs/jfs/namei.c
View file @
3ea7f245
...
...
@@ -772,16 +772,17 @@ int jfs_link(struct dentry *old_dentry,
jfs_info
(
"jfs_link: %s %s"
,
old_dentry
->
d_name
.
name
,
dentry
->
d_name
.
name
);
if
(
ip
->
i_nlink
==
JFS_LINK_MAX
)
return
-
EMLINK
;
if
(
ip
->
i_nlink
==
0
)
return
-
ENOENT
;
tid
=
txBegin
(
ip
->
i_sb
,
0
);
down
(
&
JFS_IP
(
dir
)
->
commit_sem
);
down
(
&
JFS_IP
(
ip
)
->
commit_sem
);
if
(
ip
->
i_nlink
==
JFS_LINK_MAX
)
{
rc
=
-
EMLINK
;
goto
out
;
}
/*
* scan parent directory for entry/freespace
*/
...
...
include/asm-sparc/ioctl.h
View file @
3ea7f245
...
...
@@ -54,7 +54,9 @@
(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) )
#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_XSIZEMASK)
#define _IOC_SIZE(nr) \
((((((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) & (_IOC_WRITE|_IOC_READ)) == 0)? \
0: (((nr) >> _IOC_SIZESHIFT) & _IOC_XSIZEMASK))
/* ...and for the PCMCIA and sound. */
#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
...
...
include/asm-sparc64/ioctl.h
View file @
3ea7f245
...
...
@@ -54,7 +54,9 @@
(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) )
#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_XSIZEMASK)
#define _IOC_SIZE(nr) \
((((((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) & (_IOC_WRITE|_IOC_READ)) == 0)? \
0: (((nr) >> _IOC_SIZESHIFT) & _IOC_XSIZEMASK))
/* ...and for the PCMCIA and sound. */
#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
...
...
include/linux/libata.h
View file @
3ea7f245
...
...
@@ -207,6 +207,7 @@ struct ata_probe_ent {
unsigned
int
irq_flags
;
unsigned
long
host_flags
;
void
*
mmio_base
;
void
*
private_data
;
};
struct
ata_host_set
{
...
...
@@ -215,6 +216,7 @@ struct ata_host_set {
unsigned
long
irq
;
void
*
mmio_base
;
unsigned
int
n_ports
;
void
*
private_data
;
struct
ata_port
*
ports
[
0
];
};
...
...
@@ -264,6 +266,8 @@ struct ata_queued_cmd {
ata_qc_cb_t
callback
;
struct
semaphore
sem
;
void
*
private_data
;
};
struct
ata_host_stats
{
...
...
@@ -333,6 +337,8 @@ struct ata_port {
struct
semaphore
thr_sem
;
struct
timer_list
thr_timer
;
unsigned
long
thr_timeout
;
void
*
private_data
;
};
struct
ata_port_operations
{
...
...
@@ -363,6 +369,11 @@ struct ata_port_operations {
u32
(
*
scr_read
)
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
);
void
(
*
scr_write
)
(
struct
ata_port
*
ap
,
unsigned
int
sc_reg
,
u32
val
);
int
(
*
port_start
)
(
struct
ata_port
*
ap
);
void
(
*
port_stop
)
(
struct
ata_port
*
ap
);
void
(
*
host_stop
)
(
struct
ata_host_set
*
host_set
);
};
struct
ata_port_info
{
...
...
@@ -406,6 +417,8 @@ extern u8 ata_check_status_pio(struct ata_port *ap);
extern
u8
ata_check_status_mmio
(
struct
ata_port
*
ap
);
extern
void
ata_exec_command_pio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
);
extern
void
ata_exec_command_mmio
(
struct
ata_port
*
ap
,
struct
ata_taskfile
*
tf
);
extern
int
ata_port_start
(
struct
ata_port
*
ap
);
extern
void
ata_port_stop
(
struct
ata_port
*
ap
);
extern
irqreturn_t
ata_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
);
extern
void
ata_fill_sg
(
struct
ata_queued_cmd
*
qc
);
extern
void
ata_bmdma_start_mmio
(
struct
ata_queued_cmd
*
qc
);
...
...
include/linux/llc.h
View file @
3ea7f245
...
...
@@ -12,20 +12,17 @@
*
* See the GNU General Public License for more details.
*/
#define __LLC_SOCK_SIZE__
28
/* sizeof(sockaddr_llc), word align. */
#define __LLC_SOCK_SIZE__
16
/* sizeof(sockaddr_llc), word align. */
struct
sockaddr_llc
{
sa_family_t
sllc_family
;
/* AF_LLC */
sa_family_t
sllc_arphrd
;
/* ARPHRD_ETHER */
unsigned
char
sllc_test
;
unsigned
char
sllc_xid
;
unsigned
char
sllc_ua
;
/* UA data, only for SOCK_STREAM. */
unsigned
char
sllc_dsap
;
unsigned
char
sllc_ssap
;
unsigned
char
sllc_dmac
[
IFHWADDRLEN
];
unsigned
char
sllc_smac
[
IFHWADDRLEN
];
unsigned
char
sllc_mmac
[
IFHWADDRLEN
];
unsigned
char
sllc_sap
;
unsigned
char
sllc_mac
[
IFHWADDRLEN
];
unsigned
char
__pad
[
__LLC_SOCK_SIZE__
-
sizeof
(
sa_family_t
)
*
2
-
sizeof
(
unsigned
char
)
*
5
-
IFHWADDRLEN
*
3
];
sizeof
(
unsigned
char
)
*
4
-
IFHWADDRLEN
];
};
/* sockopt definitions. */
...
...
include/linux/netdevice.h
View file @
3ea7f245
...
...
@@ -498,6 +498,8 @@ extern void probe_old_netdevs(void);
extern
int
netdev_boot_setup_add
(
char
*
name
,
struct
ifmap
*
map
);
extern
int
netdev_boot_setup_check
(
struct
net_device
*
dev
);
extern
struct
net_device
*
dev_getbyhwaddr
(
unsigned
short
type
,
char
*
hwaddr
);
extern
struct
net_device
*
__dev_getfirstbyhwtype
(
unsigned
short
type
);
extern
struct
net_device
*
dev_getfirstbyhwtype
(
unsigned
short
type
);
extern
void
dev_add_pack
(
struct
packet_type
*
pt
);
extern
void
dev_remove_pack
(
struct
packet_type
*
pt
);
extern
void
__dev_remove_pack
(
struct
packet_type
*
pt
);
...
...
include/linux/pci_ids.h
View file @
3ea7f245
...
...
@@ -440,6 +440,7 @@
#define PCI_DEVICE_ID_AMD_LANCE 0x2000
#define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001
#define PCI_DEVICE_ID_AMD_SCSI 0x2020
#define PCI_DEVICE_ID_AMD_SERENADE 0x36c0
#define PCI_DEVICE_ID_AMD_FE_GATE_7006 0x7006
#define PCI_DEVICE_ID_AMD_FE_GATE_7007 0x7007
#define PCI_DEVICE_ID_AMD_FE_GATE_700C 0x700C
...
...
@@ -1023,7 +1024,13 @@
#define PCI_DEVICE_ID_NVIDIA_VTNT2 0x002C
#define PCI_DEVICE_ID_NVIDIA_UVTNT2 0x002D
#define PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE 0x0065
#define PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE 0x0085
#define PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA 0x008e
#define PCI_DEVICE_ID_NVIDIA_ITNT2 0x00A0
#define PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE 0x00d5
#define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA 0x00e3
#define PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE 0x00e5
#define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2 0x00ee
#define PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR 0x0100
#define PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR 0x0101
#define PCI_DEVICE_ID_NVIDIA_QUADRO 0x0103
...
...
include/linux/sysctl.h
View file @
3ea7f245
...
...
@@ -217,7 +217,8 @@ enum
NET_CORE_NO_CONG
=
14
,
NET_CORE_LO_CONG
=
15
,
NET_CORE_MOD_CONG
=
16
,
NET_CORE_DEV_WEIGHT
=
17
NET_CORE_DEV_WEIGHT
=
17
,
NET_CORE_SOMAXCONN
=
18
,
};
/* /proc/sys/net/ethernet */
...
...
net/appletalk/ddp.c
View file @
3ea7f245
...
...
@@ -249,6 +249,7 @@ static struct atalk_iface *atif_add_device(struct net_device *dev,
if
(
!
iface
)
goto
out
;
memset
(
iface
,
0
,
sizeof
(
*
iface
));
dev_hold
(
dev
);
iface
->
dev
=
dev
;
dev
->
atalk_ptr
=
iface
;
...
...
@@ -580,6 +581,7 @@ static int atrtr_create(struct rtentry *r, struct net_device *devhint)
retval
=
-
ENOBUFS
;
if
(
!
rt
)
goto
out
;
memset
(
rt
,
0
,
sizeof
(
*
rt
));
rt
->
next
=
atalk_routes
;
atalk_routes
=
rt
;
...
...
@@ -937,9 +939,13 @@ static unsigned long atalk_sum_partial(const unsigned char *data,
{
/* This ought to be unwrapped neatly. I'll trust gcc for now */
while
(
len
--
)
{
sum
+=
*
data
++
;
sum
+=
*
data
;
sum
<<=
1
;
sum
=
((
sum
>>
16
)
+
sum
)
&
0xFFFF
;
if
(
sum
&
0x10000
)
{
sum
++
;
sum
&=
0xffff
;
}
data
++
;
}
return
sum
;
}
...
...
@@ -1048,6 +1054,7 @@ static int atalk_create(struct socket *sock, int protocol)
at
=
at_sk
(
sk
)
=
kmalloc
(
sizeof
(
*
at
),
GFP_KERNEL
);
if
(
!
at
)
goto
outsk
;
memset
(
at
,
0
,
sizeof
(
*
at
));
rc
=
0
;
sock
->
ops
=
&
atalk_dgram_ops
;
sock_init_data
(
sock
,
sk
);
...
...
net/compat.c
View file @
3ea7f245
...
...
@@ -322,7 +322,7 @@ static int do_netfilter_replace(int fd, int level, int optname,
u32
origsize
,
tmp32
,
num_counters
;
unsigned
int
repl_nat_size
;
int
ret
;
int
i
,
num_ents
;
int
i
;
compat_uptr_t
ucntrs
;
if
(
get_user
(
origsize
,
&
urepl
->
size
))
...
...
@@ -366,15 +366,10 @@ static int do_netfilter_replace(int fd, int level, int optname,
__put_user
(
compat_ptr
(
ucntrs
),
&
repl_nat
->
counters
))
goto
out
;
num_ents
=
origsize
/
sizeof
(
struct
ipt_entry
);
for
(
i
=
0
;
i
<
num_ents
;
i
++
)
{
struct
ipt_entry
ent
;
if
(
__copy_from_user
(
&
ent
,
&
urepl
->
entries
[
i
],
sizeof
(
ent
))
||
__copy_to_user
(
&
repl_nat
->
entries
[
i
],
&
ent
,
sizeof
(
ent
)))
goto
out
;
}
if
(
__copy_in_user
(
&
repl_nat
->
entries
[
0
],
&
urepl
->
entries
[
0
],
origsize
))
goto
out
;
for
(
i
=
0
;
i
<
NF_IP_NUMHOOKS
;
i
++
)
{
if
(
__get_user
(
tmp32
,
&
urepl
->
hook_entry
[
i
])
||
...
...
net/core/dev.c
View file @
3ea7f245
...
...
@@ -550,6 +550,32 @@ struct net_device *dev_getbyhwaddr(unsigned short type, char *ha)
return
dev
;
}
struct
net_device
*
__dev_getfirstbyhwtype
(
unsigned
short
type
)
{
struct
net_device
*
dev
;
for
(
dev
=
dev_base
;
dev
;
dev
=
dev
->
next
)
if
(
dev
->
type
==
type
)
break
;
return
dev
;
}
EXPORT_SYMBOL
(
__dev_getfirstbyhwtype
);
struct
net_device
*
dev_getfirstbyhwtype
(
unsigned
short
type
)
{
struct
net_device
*
dev
;
rtnl_lock
();
dev
=
__dev_getfirstbyhwtype
(
type
);
if
(
dev
)
dev_hold
(
dev
);
rtnl_unlock
();
return
dev
;
}
EXPORT_SYMBOL
(
dev_getfirstbyhwtype
);
/**
* dev_get_by_flags - find any device with given flags
* @if_flags: IFF_* values
...
...
net/core/skbuff.c
View file @
3ea7f245
...
...
@@ -583,6 +583,8 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
*/
struct
sk_buff
*
n
=
alloc_skb
(
newheadroom
+
skb
->
len
+
newtailroom
,
gfp_mask
);
int
head_copy_len
,
head_copy_off
;
if
(
!
n
)
return
NULL
;
...
...
@@ -591,8 +593,16 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
/* Set the tail pointer and length */
skb_put
(
n
,
skb
->
len
);
/* Copy the data only. */
if
(
skb_copy_bits
(
skb
,
0
,
n
->
data
,
skb
->
len
))
head_copy_len
=
skb_headroom
(
skb
);
head_copy_off
=
0
;
if
(
newheadroom
<
head_copy_len
)
{
head_copy_off
=
head_copy_len
-
newheadroom
;
head_copy_len
=
newheadroom
;
}
/* Copy the linear header and data. */
if
(
skb_copy_bits
(
skb
,
-
head_copy_len
,
n
->
head
+
head_copy_off
,
skb
->
len
+
head_copy_len
))
BUG
();
copy_skb_header
(
n
,
skb
);
...
...
net/core/sysctl_net_core.c
View file @
3ea7f245
...
...
@@ -29,6 +29,7 @@ extern __u32 sysctl_rmem_default;
extern
int
sysctl_core_destroy_delay
;
extern
int
sysctl_optmem_max
;
extern
int
sysctl_somaxconn
;
#ifdef CONFIG_NET_DIVERT
extern
char
sysctl_divert_version
[];
...
...
@@ -174,6 +175,14 @@ ctl_table core_table[] = {
},
#endif
/* CONFIG_NET_DIVERT */
#endif
/* CONFIG_NET */
{
.
ctl_name
=
NET_CORE_SOMAXCONN
,
.
procname
=
"somaxconn"
,
.
data
=
&
sysctl_somaxconn
,
.
maxlen
=
sizeof
(
int
),
.
mode
=
0644
,
.
proc_handler
=
&
proc_dointvec
},
{
.
ctl_name
=
0
}
};
...
...
net/ipv4/ah4.c
View file @
3ea7f245
...
...
@@ -245,6 +245,9 @@ static int ah_init_state(struct xfrm_state *x, void *args)
struct
ah_data
*
ahp
=
NULL
;
struct
xfrm_algo_desc
*
aalg_desc
;
if
(
!
x
->
aalg
)
goto
error
;
/* null auth can use a zero length key */
if
(
x
->
aalg
->
alg_key_len
>
512
)
goto
error
;
...
...
net/ipv4/ipcomp.c
View file @
3ea7f245
...
...
@@ -344,10 +344,15 @@ static void ipcomp_destroy(struct xfrm_state *x)
static
int
ipcomp_init_state
(
struct
xfrm_state
*
x
,
void
*
args
)
{
int
err
=
-
ENOMEM
;
int
err
;
struct
ipcomp_data
*
ipcd
;
struct
xfrm_algo_desc
*
calg_desc
;
err
=
-
EINVAL
;
if
(
!
x
->
calg
)
goto
out
;
err
=
-
ENOMEM
;
ipcd
=
kmalloc
(
sizeof
(
*
ipcd
),
GFP_KERNEL
);
if
(
!
ipcd
)
goto
error
;
...
...
net/ipv6/ah6.c
View file @
3ea7f245
...
...
@@ -380,6 +380,9 @@ static int ah6_init_state(struct xfrm_state *x, void *args)
struct
ah_data
*
ahp
=
NULL
;
struct
xfrm_algo_desc
*
aalg_desc
;
if
(
!
x
->
aalg
)
goto
error
;
/* null auth can use a zero length key */
if
(
x
->
aalg
->
alg_key_len
>
512
)
goto
error
;
...
...
net/ipv6/ipcomp6.c
View file @
3ea7f245
...
...
@@ -276,10 +276,15 @@ static void ipcomp6_destroy(struct xfrm_state *x)
static
int
ipcomp6_init_state
(
struct
xfrm_state
*
x
,
void
*
args
)
{
int
err
=
-
ENOMEM
;
int
err
;
struct
ipcomp_data
*
ipcd
;
struct
xfrm_algo_desc
*
calg_desc
;
err
=
-
EINVAL
;
if
(
!
x
->
calg
)
goto
out
;
err
=
-
ENOMEM
;
ipcd
=
kmalloc
(
sizeof
(
*
ipcd
),
GFP_KERNEL
);
if
(
!
ipcd
)
goto
error
;
...
...
net/ipx/af_ipx.c
View file @
3ea7f245
...
...
@@ -326,7 +326,6 @@ void __ipxitf_down(struct ipx_interface *intrfc)
if
(
intrfc
->
if_dev
)
dev_put
(
intrfc
->
if_dev
);
kfree
(
intrfc
);
module_put
(
THIS_MODULE
);
}
void
ipxitf_down
(
struct
ipx_interface
*
intrfc
)
...
...
@@ -358,6 +357,17 @@ static int ipxitf_device_event(struct notifier_block *notifier,
return
NOTIFY_DONE
;
}
static
__exit
void
ipxitf_cleanup
(
void
)
{
struct
ipx_interface
*
i
,
*
tmp
;
spin_lock_bh
(
&
ipx_interfaces_lock
);
list_for_each_entry_safe
(
i
,
tmp
,
&
ipx_interfaces
,
node
)
__ipxitf_put
(
i
);
spin_unlock_bh
(
&
ipx_interfaces_lock
);
}
static
void
ipxitf_def_skb_handler
(
struct
sock
*
sock
,
struct
sk_buff
*
skb
)
{
if
(
sock_queue_rcv_skb
(
sock
,
skb
)
<
0
)
...
...
@@ -888,7 +898,6 @@ static struct ipx_interface *ipxitf_alloc(struct net_device *dev, __u32 netnum,
INIT_HLIST_HEAD
(
&
intrfc
->
if_sklist
);
atomic_set
(
&
intrfc
->
refcnt
,
1
);
spin_lock_init
(
&
intrfc
->
if_sklist_lock
);
__module_get
(
THIS_MODULE
);
}
return
intrfc
;
...
...
@@ -1979,21 +1988,13 @@ static int __init ipx_init(void)
static
void
__exit
ipx_proto_finito
(
void
)
{
/*
* No need to worry about having anything on the ipx_interfaces list,
* when a interface is created we increment the module usage count, so
* the module will only be unloaded when there are no more interfaces
*/
if
(
unlikely
(
!
list_empty
(
&
ipx_interfaces
)))
BUG
();
if
(
unlikely
(
!
list_empty
(
&
ipx_routes
)))
BUG
();
ipx_proc_exit
();
ipx_unregister_sysctl
();
unregister_netdevice_notifier
(
&
ipx_dev_notifier
);
ipxitf_cleanup
();
unregister_snap_client
(
pSNAP_datalink
);
pSNAP_datalink
=
NULL
;
...
...
net/llc/af_llc.c
View file @
3ea7f245
...
...
@@ -187,6 +187,8 @@ static int llc_ui_release(struct socket *sock)
llc_release_sockets
(
llc
->
sap
);
llc_sap_close
(
llc
->
sap
);
}
if
(
llc
->
dev
)
dev_put
(
llc
->
dev
);
sock_put
(
sk
);
llc_sk_free
(
sk
);
out:
...
...
@@ -244,31 +246,20 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
struct
sock
*
sk
=
sock
->
sk
;
struct
llc_opt
*
llc
=
llc_sk
(
sk
);
struct
llc_sap
*
sap
;
struct
net_device
*
dev
=
NULL
;
int
rc
=
-
EINVAL
;
if
(
!
sk
->
sk_zapped
)
goto
out
;
/* bind to a specific mac, optional. */
if
(
!
llc_mac_null
(
addr
->
sllc_smac
))
{
rtnl_lock
();
dev
=
dev_getbyhwaddr
(
addr
->
sllc_arphrd
,
addr
->
sllc_smac
);
rtnl_unlock
();
rc
=
-
ENETUNREACH
;
if
(
!
dev
)
goto
out
;
llc
->
dev
=
dev
;
}
/* bind to a specific sap, optional. */
if
(
!
addr
->
sllc_s
s
ap
)
{
if
(
!
addr
->
sllc_sap
)
{
rc
=
-
EUSERS
;
addr
->
sllc_s
s
ap
=
llc_ui_autoport
();
if
(
!
addr
->
sllc_s
s
ap
)
addr
->
sllc_sap
=
llc_ui_autoport
();
if
(
!
addr
->
sllc_sap
)
goto
out
;
}
sap
=
llc_sap_find
(
addr
->
sllc_s
s
ap
);
sap
=
llc_sap_find
(
addr
->
sllc_sap
);
if
(
!
sap
)
{
sap
=
llc_sap_open
(
addr
->
sllc_s
s
ap
,
NULL
);
sap
=
llc_sap_open
(
addr
->
sllc_sap
,
NULL
);
rc
=
-
EBUSY
;
/* some other network layer is using the sap */
if
(
!
sap
)
goto
out
;
...
...
@@ -276,20 +267,14 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
struct
llc_addr
laddr
,
daddr
;
struct
sock
*
ask
;
rc
=
-
EUSERS
;
/* can't get exclusive use of sap */
if
(
!
dev
&&
llc_mac_null
(
addr
->
sllc_mmac
))
goto
out
;
memset
(
&
laddr
,
0
,
sizeof
(
laddr
));
memset
(
&
daddr
,
0
,
sizeof
(
daddr
));
if
(
!
llc_mac_null
(
addr
->
sllc_mmac
))
{
if
(
sk
->
sk_type
!=
SOCK_DGRAM
)
{
rc
=
-
EOPNOTSUPP
;
goto
out
;
}
memcpy
(
laddr
.
mac
,
addr
->
sllc_mmac
,
IFHWADDRLEN
);
}
else
memcpy
(
laddr
.
mac
,
addr
->
sllc_smac
,
IFHWADDRLEN
);
laddr
.
lsap
=
addr
->
sllc_ssap
;
/*
* FIXME: check if the the address is multicast,
* only SOCK_DGRAM can do this.
*/
memcpy
(
laddr
.
mac
,
addr
->
sllc_mac
,
IFHWADDRLEN
);
laddr
.
lsap
=
addr
->
sllc_sap
;
rc
=
-
EADDRINUSE
;
/* mac + sap clash. */
ask
=
llc_lookup_established
(
sap
,
&
daddr
,
&
laddr
);
if
(
ask
)
{
...
...
@@ -297,11 +282,9 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
goto
out
;
}
}
llc
->
laddr
.
lsap
=
addr
->
sllc_s
s
ap
;
llc
->
laddr
.
lsap
=
addr
->
sllc_sap
;
if
(
llc
->
dev
)
memcpy
(
llc
->
laddr
.
mac
,
llc
->
dev
->
dev_addr
,
IFHWADDRLEN
);
llc
->
daddr
.
lsap
=
addr
->
sllc_dsap
;
memcpy
(
llc
->
daddr
.
mac
,
addr
->
sllc_dmac
,
IFHWADDRLEN
);
memcpy
(
&
llc
->
addr
,
addr
,
sizeof
(
llc
->
addr
));
/* assign new connection to its SAP */
llc_sap_add_socket
(
sap
,
sk
);
...
...
@@ -334,7 +317,7 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
struct
sock
*
sk
=
sock
->
sk
;
int
rc
=
-
EINVAL
;
dprintk
(
"%s: binding %02X
\n
"
,
__FUNCTION__
,
addr
->
sllc_s
s
ap
);
dprintk
(
"%s: binding %02X
\n
"
,
__FUNCTION__
,
addr
->
sllc_sap
);
if
(
!
sk
->
sk_zapped
||
addrlen
!=
sizeof
(
*
addr
))
goto
out
;
rc
=
-
EAFNOSUPPORT
;
...
...
@@ -386,9 +369,9 @@ static int llc_ui_shutdown(struct socket *sock, int how)
* @flags: Operational flags specified by the user.
*
* Connect to a remote llc2 mac + sap. The caller must specify the
* destination mac and address to connect to. If the user previously
* called bind(2) with a smac the
user does not need to specify the sourc
e
*
address and mac
.
* destination mac and address to connect to. If the user
hasn't
previously
* called bind(2) with a smac the
address of the first interface of th
e
*
specified arp type will be used
.
* This function will autobind if user did not previously call bind.
* Returns: 0 upon success, negative otherwise.
*/
...
...
@@ -413,15 +396,16 @@ static int llc_ui_connect(struct socket *sock, struct sockaddr *uaddr,
rc
=
llc_ui_autobind
(
sock
,
addr
);
if
(
rc
)
goto
out
;
llc
->
daddr
.
lsap
=
addr
->
sllc_sap
;
memcpy
(
llc
->
daddr
.
mac
,
addr
->
sllc_mac
,
IFHWADDRLEN
);
}
if
(
!
llc
->
dev
)
{
rc
=
-
ENODEV
;
rtnl_lock
();
dev
=
dev_getbyhwaddr
(
addr
->
sllc_arphrd
,
addr
->
sllc_smac
);
rtnl_unlock
();
dev
=
dev_getfirstbyhwtype
(
addr
->
sllc_arphrd
);
if
(
!
dev
)
goto
out
;
llc
->
dev
=
dev
;
memcpy
(
llc
->
laddr
.
mac
,
llc
->
dev
->
dev_addr
,
IFHWADDRLEN
);
}
else
dev
=
llc
->
dev
;
if
(
sk
->
sk_type
!=
SOCK_STREAM
)
...
...
@@ -433,7 +417,7 @@ static int llc_ui_connect(struct socket *sock, struct sockaddr *uaddr,
sk
->
sk_state
=
TCP_SYN_SENT
;
llc
->
link
=
llc_ui_next_link_no
(
llc
->
sap
->
laddr
.
lsap
);
rc
=
llc_establish_connection
(
sk
,
dev
->
dev_addr
,
addr
->
sllc_
dmac
,
addr
->
sllc_d
sap
);
addr
->
sllc_
mac
,
addr
->
sllc_
sap
);
if
(
rc
)
{
dprintk
(
"%s: llc_ui_send_conn failed :-(
\n
"
,
__FUNCTION__
);
sock
->
state
=
SS_UNCONNECTED
;
...
...
@@ -492,12 +476,6 @@ static int llc_ui_wait_for_disc(struct sock *sk, int timeout)
add_wait_queue_exclusive
(
sk
->
sk_sleep
,
&
wait
);
for
(;;)
{
__set_current_state
(
TASK_INTERRUPTIBLE
);
rc
=
-
ERESTARTSYS
;
if
(
signal_pending
(
current
))
break
;
rc
=
-
EAGAIN
;
if
(
!
timeout
)
break
;
rc
=
0
;
if
(
sk
->
sk_state
!=
TCP_CLOSE
)
{
release_sock
(
sk
);
...
...
@@ -505,6 +483,12 @@ static int llc_ui_wait_for_disc(struct sock *sk, int timeout)
lock_sock
(
sk
);
}
else
break
;
rc
=
-
ERESTARTSYS
;
if
(
signal_pending
(
current
))
break
;
rc
=
-
EAGAIN
;
if
(
!
timeout
)
break
;
}
__set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
sk
->
sk_sleep
,
&
wait
);
...
...
@@ -522,12 +506,6 @@ static int llc_ui_wait_for_conn(struct sock *sk, int timeout)
rc
=
-
EAGAIN
;
if
(
sk
->
sk_state
==
TCP_CLOSE
)
break
;
rc
=
-
ERESTARTSYS
;
if
(
signal_pending
(
current
))
break
;
rc
=
-
EAGAIN
;
if
(
!
timeout
)
break
;
rc
=
0
;
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
release_sock
(
sk
);
...
...
@@ -535,6 +513,12 @@ static int llc_ui_wait_for_conn(struct sock *sk, int timeout)
lock_sock
(
sk
);
}
else
break
;
rc
=
-
ERESTARTSYS
;
if
(
signal_pending
(
current
))
break
;
rc
=
-
EAGAIN
;
if
(
!
timeout
)
break
;
}
__set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
sk
->
sk_sleep
,
&
wait
);
...
...
@@ -551,12 +535,6 @@ static int llc_ui_wait_for_data(struct sock *sk, int timeout)
__set_current_state
(
TASK_INTERRUPTIBLE
);
if
(
sk
->
sk_shutdown
&
RCV_SHUTDOWN
)
break
;
rc
=
-
ERESTARTSYS
;
if
(
signal_pending
(
current
))
break
;
rc
=
-
EAGAIN
;
if
(
!
timeout
)
break
;
/*
* Well, if we have backlog, try to process it now.
*/
...
...
@@ -571,6 +549,12 @@ static int llc_ui_wait_for_data(struct sock *sk, int timeout)
lock_sock
(
sk
);
}
else
break
;
rc
=
-
ERESTARTSYS
;
if
(
signal_pending
(
current
))
break
;
rc
=
-
EAGAIN
;
if
(
!
timeout
)
break
;
}
__set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
sk
->
sk_sleep
,
&
wait
);
...
...
@@ -590,12 +574,6 @@ static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout)
rc
=
-
ENOTCONN
;
if
(
sk
->
sk_shutdown
&
RCV_SHUTDOWN
)
break
;
rc
=
-
ERESTARTSYS
;
if
(
signal_pending
(
current
))
break
;
rc
=
-
EAGAIN
;
if
(
!
timeout
)
break
;
rc
=
0
;
if
(
llc_data_accept_state
(
llc
->
state
)
||
llc
->
p_flag
)
{
release_sock
(
sk
);
...
...
@@ -603,6 +581,12 @@ static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout)
lock_sock
(
sk
);
}
else
break
;
rc
=
-
ERESTARTSYS
;
if
(
signal_pending
(
current
))
break
;
rc
=
-
EAGAIN
;
if
(
!
timeout
)
break
;
}
__set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
sk
->
sk_sleep
,
&
wait
);
...
...
@@ -626,7 +610,7 @@ static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
int
rc
=
-
EOPNOTSUPP
;
dprintk
(
"%s: accepting on %02X
\n
"
,
__FUNCTION__
,
llc_sk
(
sk
)
->
addr
.
sllc_s
s
ap
);
llc_sk
(
sk
)
->
addr
.
sllc_sap
);
lock_sock
(
sk
);
if
(
sk
->
sk_type
!=
SOCK_STREAM
)
goto
out
;
...
...
@@ -638,7 +622,7 @@ static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
if
(
rc
)
goto
out
;
dprintk
(
"%s: got a new connection on %02X
\n
"
,
__FUNCTION__
,
llc_sk
(
sk
)
->
addr
.
sllc_s
s
ap
);
llc_sk
(
sk
)
->
addr
.
sllc_sap
);
skb
=
skb_dequeue
(
&
sk
->
sk_receive_queue
);
rc
=
-
EINVAL
;
if
(
!
skb
->
sk
)
...
...
@@ -654,8 +638,6 @@ static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
llc
=
llc_sk
(
sk
);
newllc
=
llc_sk
(
newsk
);
memcpy
(
&
newllc
->
addr
,
&
llc
->
addr
,
sizeof
(
newllc
->
addr
));
memcpy
(
newllc
->
addr
.
sllc_dmac
,
newllc
->
daddr
.
mac
,
IFHWADDRLEN
);
newllc
->
addr
.
sllc_dsap
=
newllc
->
daddr
.
lsap
;
newllc
->
link
=
llc_ui_next_link_no
(
newllc
->
laddr
.
lsap
);
/* put original socket back into a clean listen state. */
...
...
@@ -663,7 +645,7 @@ static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
sk
->
sk_ack_backlog
--
;
skb
->
sk
=
NULL
;
dprintk
(
"%s: ok success on %02X, client on %02X
\n
"
,
__FUNCTION__
,
llc_sk
(
sk
)
->
addr
.
sllc_s
sap
,
newllc
->
addr
.
sllc_d
sap
);
llc_sk
(
sk
)
->
addr
.
sllc_s
ap
,
newllc
->
daddr
.
l
sap
);
frees:
kfree_skb
(
skb
);
out:
...
...
@@ -766,10 +748,8 @@ static int llc_ui_sendmsg(struct kiocb *iocb, struct socket *sock,
goto
release
;
}
if
(
!
llc
->
dev
)
{
rtnl_lock
();
dev
=
dev_getbyhwaddr
(
addr
->
sllc_arphrd
,
addr
->
sllc_smac
);
rtnl_unlock
();
rc
=
-
ENETUNREACH
;
rc
=
-
ENODEV
;
dev
=
dev_getfirstbyhwtype
(
addr
->
sllc_arphrd
);
if
(
!
dev
)
goto
release
;
}
else
...
...
@@ -792,18 +772,18 @@ static int llc_ui_sendmsg(struct kiocb *iocb, struct socket *sock,
if
(
rc
)
goto
out
;
if
(
sk
->
sk_type
==
SOCK_DGRAM
||
addr
->
sllc_ua
)
{
llc_build_and_send_ui_pkt
(
llc
->
sap
,
skb
,
addr
->
sllc_
d
mac
,
addr
->
sllc_
d
sap
);
llc_build_and_send_ui_pkt
(
llc
->
sap
,
skb
,
addr
->
sllc_mac
,
addr
->
sllc_sap
);
goto
out
;
}
if
(
addr
->
sllc_test
)
{
llc_build_and_send_test_pkt
(
llc
->
sap
,
skb
,
addr
->
sllc_
d
mac
,
addr
->
sllc_
d
sap
);
llc_build_and_send_test_pkt
(
llc
->
sap
,
skb
,
addr
->
sllc_mac
,
addr
->
sllc_sap
);
goto
out
;
}
if
(
addr
->
sllc_xid
)
{
llc_build_and_send_xid_pkt
(
llc
->
sap
,
skb
,
addr
->
sllc_
d
mac
,
addr
->
sllc_
d
sap
);
llc_build_and_send_xid_pkt
(
llc
->
sap
,
skb
,
addr
->
sllc_mac
,
addr
->
sllc_sap
);
goto
out
;
}
rc
=
-
ENOPROTOOPT
;
...
...
@@ -851,17 +831,17 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
goto
out
;
if
(
llc
->
dev
)
sllc
.
sllc_arphrd
=
llc
->
dev
->
type
;
sllc
.
sllc_
d
sap
=
llc
->
daddr
.
lsap
;
memcpy
(
&
sllc
.
sllc_
d
mac
,
&
llc
->
daddr
.
mac
,
IFHWADDRLEN
);
sllc
.
sllc_sap
=
llc
->
daddr
.
lsap
;
memcpy
(
&
sllc
.
sllc_mac
,
&
llc
->
daddr
.
mac
,
IFHWADDRLEN
);
}
else
{
rc
=
-
EINVAL
;
if
(
!
llc
->
sap
)
goto
out
;
sllc
.
sllc_s
s
ap
=
llc
->
sap
->
laddr
.
lsap
;
sllc
.
sllc_sap
=
llc
->
sap
->
laddr
.
lsap
;
if
(
llc
->
dev
)
{
sllc
.
sllc_arphrd
=
llc
->
dev
->
type
;
memcpy
(
&
sllc
.
sllc_
s
mac
,
&
llc
->
dev
->
dev_addr
,
memcpy
(
&
sllc
.
sllc_mac
,
&
llc
->
dev
->
dev_addr
,
IFHWADDRLEN
);
}
}
...
...
net/llc/llc_conn.c
View file @
3ea7f245
...
...
@@ -514,7 +514,8 @@ struct sock *llc_lookup_listener(struct llc_sap *sap, struct llc_addr *laddr)
if
(
rc
->
sk_type
==
SOCK_STREAM
&&
rc
->
sk_state
==
TCP_LISTEN
&&
llc
->
laddr
.
lsap
==
laddr
->
lsap
&&
llc_mac_match
(
llc
->
laddr
.
mac
,
laddr
->
mac
))
{
(
llc_mac_match
(
llc
->
laddr
.
mac
,
laddr
->
mac
)
||
llc_mac_null
(
llc
->
laddr
.
mac
)))
{
sock_hold
(
rc
);
goto
found
;
}
...
...
net/llc/llc_proc.c
View file @
3ea7f245
...
...
@@ -44,15 +44,12 @@ static struct sock *llc_get_sk_idx(loff_t pos)
read_lock_bh
(
&
sap
->
sk_list
.
lock
);
sk_for_each
(
sk
,
node
,
&
sap
->
sk_list
.
list
)
{
if
(
!
pos
)
break
;
goto
found
;
--
pos
;
}
read_unlock_bh
(
&
sap
->
sk_list
.
lock
);
if
(
!
pos
)
{
if
(
node
)
goto
found
;
if
(
!
pos
)
break
;
}
}
sk
=
NULL
;
found:
...
...
@@ -105,7 +102,7 @@ static void *llc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
static
void
llc_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
if
(
v
)
{
if
(
v
&&
v
!=
SEQ_START_TOKEN
)
{
struct
sock
*
sk
=
v
;
struct
llc_opt
*
llc
=
llc_sk
(
sk
);
struct
llc_sap
*
sap
=
llc
->
sap
;
...
...
@@ -128,18 +125,16 @@ static int llc_seq_socket_show(struct seq_file *seq, void *v)
sk
=
v
;
llc
=
llc_sk
(
sk
);
seq_printf
(
seq
,
"%2X %2X "
,
sk
->
sk_type
,
!
llc_mac_null
(
llc
->
addr
.
sllc_mmac
)
);
/* FIXME: check if the address is multicast */
seq_printf
(
seq
,
"%2X %2X "
,
sk
->
sk_type
,
0
);
if
(
llc
->
dev
&&
llc_mac_null
(
llc
->
addr
.
sllc_mmac
)
)
if
(
llc
->
dev
)
llc_ui_format_mac
(
seq
,
llc
->
dev
->
dev_addr
);
else
if
(
!
llc_mac_null
(
llc
->
addr
.
sllc_mmac
))
llc_ui_format_mac
(
seq
,
llc
->
addr
.
sllc_mmac
);
else
seq_printf
(
seq
,
"00:00:00:00:00:00"
);
seq_printf
(
seq
,
"@%02X "
,
llc
->
sap
->
laddr
.
lsap
);
llc_ui_format_mac
(
seq
,
llc
->
addr
.
sllc_d
mac
);
seq_printf
(
seq
,
"@%02X %8d %8d %2d %3d %4d
\n
"
,
llc
->
addr
.
sllc_d
sap
,
llc_ui_format_mac
(
seq
,
llc
->
daddr
.
mac
);
seq_printf
(
seq
,
"@%02X %8d %8d %2d %3d %4d
\n
"
,
llc
->
daddr
.
l
sap
,
atomic_read
(
&
sk
->
sk_wmem_alloc
),
atomic_read
(
&
sk
->
sk_rmem_alloc
),
sk
->
sk_state
,
...
...
net/llc/llc_sap.c
View file @
3ea7f245
...
...
@@ -54,10 +54,8 @@ void llc_save_primitive(struct sk_buff* skb, u8 prim)
addr
->
sllc_test
=
prim
==
LLC_TEST_PRIM
;
addr
->
sllc_xid
=
prim
==
LLC_XID_PRIM
;
addr
->
sllc_ua
=
prim
==
LLC_DATAUNIT_PRIM
;
llc_pdu_decode_sa
(
skb
,
addr
->
sllc_smac
);
llc_pdu_decode_da
(
skb
,
addr
->
sllc_dmac
);
llc_pdu_decode_dsap
(
skb
,
&
addr
->
sllc_dsap
);
llc_pdu_decode_ssap
(
skb
,
&
addr
->
sllc_ssap
);
llc_pdu_decode_sa
(
skb
,
addr
->
sllc_mac
);
llc_pdu_decode_ssap
(
skb
,
&
addr
->
sllc_sap
);
}
/**
...
...
net/socket.c
View file @
3ea7f245
...
...
@@ -1206,14 +1206,16 @@ asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
* ready for listening.
*/
int
sysctl_somaxconn
=
SOMAXCONN
;
asmlinkage
long
sys_listen
(
int
fd
,
int
backlog
)
{
struct
socket
*
sock
;
int
err
;
if
((
sock
=
sockfd_lookup
(
fd
,
&
err
))
!=
NULL
)
{
if
((
unsigned
)
backlog
>
SOMAXCONN
)
backlog
=
SOMAXCONN
;
if
((
unsigned
)
backlog
>
sysctl_somaxconn
)
backlog
=
sysctl_somaxconn
;
err
=
security_socket_listen
(
sock
,
backlog
);
if
(
err
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment