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
ee29d109
Commit
ee29d109
authored
Oct 27, 2002
by
Alan Cox
Committed by
Linus Torvalds
Oct 27, 2002
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] MCA bus basic cleanups
parent
ecf2c214
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
1323 additions
and
1540 deletions
+1323
-1540
arch/i386/kernel/mca.c
arch/i386/kernel/mca.c
+20
-21
drivers/net/ibmlana.c
drivers/net/ibmlana.c
+87
-240
drivers/net/ibmlana.h
drivers/net/ibmlana.h
+15
-29
drivers/net/tokenring/3c359.c
drivers/net/tokenring/3c359.c
+1
-1
drivers/net/tokenring/smctr.c
drivers/net/tokenring/smctr.c
+115
-153
drivers/net/tokenring/smctr.h
drivers/net/tokenring/smctr.h
+2
-0
drivers/scsi/fd_mcs.c
drivers/scsi/fd_mcs.c
+1052
-1070
drivers/scsi/fd_mcs.h
drivers/scsi/fd_mcs.h
+31
-26
No files found.
arch/i386/kernel/mca.c
View file @
ee29d109
...
...
@@ -194,10 +194,9 @@ struct resource mca_standard_resources[] = {
#define MCA_STANDARD_RESOURCES (sizeof(mca_standard_resources)/sizeof(struct resource))
void
__init
mca_init
(
void
)
int
__init
mca_init
(
void
)
{
unsigned
int
i
,
j
;
unsigned
long
flags
;
/* WARNING: Be careful when making changes here. Putting an adapter
* and the motherboard simultaneously into setup mode may result in
...
...
@@ -209,16 +208,16 @@ void __init mca_init(void)
/* Make sure the MCA bus is present */
if
(
!
MCA_bus
)
return
;
printk
(
"Micro Channel bus detected.
\n
"
);
return
-
ENODEV
;
printk
(
KERN_INFO
"Micro Channel bus detected.
\n
"
);
/* Allocate MCA_info structure (at address divisible by 8) */
mca_info
=
(
struct
MCA_info
*
)
kmalloc
(
sizeof
(
struct
MCA_info
),
GFP_KERNEL
);
if
(
mca_info
==
NULL
)
{
printk
(
"Failed to allocate memory for mca_info!"
);
return
;
printk
(
KERN_ERR
"Failed to allocate memory for mca_info!"
);
return
-
ENOMEM
;
}
memset
(
mca_info
,
0
,
sizeof
(
struct
MCA_info
));
...
...
@@ -320,6 +319,8 @@ void __init mca_init(void)
#ifdef CONFIG_PROC_FS
mca_do_proc_init
();
#endif
return
0
;
}
subsys_initcall
(
mca_init
);
...
...
@@ -329,16 +330,16 @@ subsys_initcall(mca_init);
static
void
mca_handle_nmi_slot
(
int
slot
,
int
check_flag
)
{
if
(
slot
<
MCA_MAX_SLOT_NR
)
{
printk
(
"NMI: caused by MCA adapter in slot %d (%s)
\n
"
,
slot
+
1
,
printk
(
KERN_CRIT
"NMI: caused by MCA adapter in slot %d (%s)
\n
"
,
slot
+
1
,
mca_info
->
slot
[
slot
].
name
);
}
else
if
(
slot
==
MCA_INTEGSCSI
)
{
printk
(
"NMI: caused by MCA integrated SCSI adapter (%s)
\n
"
,
printk
(
KERN_CRIT
"NMI: caused by MCA integrated SCSI adapter (%s)
\n
"
,
mca_info
->
slot
[
slot
].
name
);
}
else
if
(
slot
==
MCA_INTEGVIDEO
)
{
printk
(
"NMI: caused by MCA integrated video adapter (%s)
\n
"
,
printk
(
KERN_CRIT
"NMI: caused by MCA integrated video adapter (%s)
\n
"
,
mca_info
->
slot
[
slot
].
name
);
}
else
if
(
slot
==
MCA_MOTHERBOARD
)
{
printk
(
"NMI: caused by motherboard (%s)
\n
"
,
printk
(
KERN_CRIT
"NMI: caused by motherboard (%s)
\n
"
,
mca_info
->
slot
[
slot
].
name
);
}
...
...
@@ -350,7 +351,7 @@ static void mca_handle_nmi_slot(int slot, int check_flag)
pos6
=
mca_read_pos
(
slot
,
6
);
pos7
=
mca_read_pos
(
slot
,
7
);
printk
(
"NMI: POS 6 = 0x%x, POS 7 = 0x%x
\n
"
,
pos6
,
pos7
);
printk
(
KERN_CRIT
"NMI: POS 6 = 0x%x, POS 7 = 0x%x
\n
"
,
pos6
,
pos7
);
}
}
/* mca_handle_nmi_slot */
...
...
@@ -367,13 +368,12 @@ void mca_handle_nmi(void)
* adapter was responsible for the error.
*/
for
(
i
=
0
;
i
<
MCA_NUMADAPTERS
;
i
++
)
{
for
(
i
=
0
;
i
<
MCA_NUMADAPTERS
;
i
++
)
{
/* Bit 7 of POS 5 is reset when this adapter has a hardware
* error. Bit 7 it reset if there's error information
* available in POS 6 and 7.
*/
pos5
=
mca_read_pos
(
i
,
5
);
if
(
!
(
pos5
&
0x80
))
{
...
...
@@ -381,7 +381,6 @@ void mca_handle_nmi(void)
return
;
}
}
mca_nmi_hook
();
}
/* mca_handle_nmi */
...
...
drivers/net/ibmlana.c
View file @
ee29d109
...
...
@@ -69,6 +69,8 @@ special acknowledgements to:
chars!
June 1st, 2000
corrected version codes, added support for the latest 2.3 changes
Oct 28th, 2002
cleaned up for the 2.5 tree <alan@redhat.com>
*************************************************************************/
...
...
@@ -103,8 +105,9 @@ special acknowledgements to:
* have to pack all state info into the device struct!
* ------------------------------------------------------------------------ */
static
char
*
MediaNames
[
Media_Count
]
=
{
"10BaseT"
,
"10Base5"
,
"Unknown"
,
"10Base2"
};
static
char
*
MediaNames
[
Media_Count
]
=
{
"10BaseT"
,
"10Base5"
,
"Unknown"
,
"10Base2"
};
/* ------------------------------------------------------------------------
* private subfunctions
...
...
@@ -113,7 +116,7 @@ static char *MediaNames[Media_Count] =
#ifdef DEBUG
/* dump all registers */
static
void
dumpregs
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
dumpregs
(
struct
net_device
*
dev
)
{
int
z
;
...
...
@@ -128,7 +131,7 @@ static void dumpregs(struct IBMLANA_NETDEV *dev)
/* dump parts of shared memory - only needed during debugging */
static
void
dumpmem
(
struct
IBMLANA_NETDEV
*
dev
,
u32
start
,
u32
len
)
static
void
dumpmem
(
struct
net_device
*
dev
,
u32
start
,
u32
len
)
{
int
z
;
...
...
@@ -136,7 +139,7 @@ static void dumpmem(struct IBMLANA_NETDEV *dev, u32 start, u32 len)
for
(
z
=
0
;
z
<
len
;
z
++
)
{
if
((
z
&
15
)
==
0
)
printk
(
"%04x:"
,
z
);
printk
(
" %02x"
,
IBMLANA_READB
(
dev
->
mem_start
+
start
+
z
));
printk
(
" %02x"
,
isa_readb
(
dev
->
mem_start
+
start
+
z
));
if
((
z
&
15
)
==
15
)
printk
(
"
\n
"
);
}
...
...
@@ -187,12 +190,12 @@ static void getaddrs(int slot, int *base, int *memlen, int *iobase,
/* wait on register value with mask and timeout */
static
int
wait_timeout
(
struct
IBMLANA_NETDEV
*
dev
,
int
regoffs
,
u16
mask
,
static
int
wait_timeout
(
struct
net_device
*
dev
,
int
regoffs
,
u16
mask
,
u16
value
,
int
timeout
)
{
unsigned
long
fin
=
jiffies
+
timeout
;
while
(
jiffies
!=
fin
)
while
(
time_before
(
jiffies
,
fin
)
)
if
((
inw
(
dev
->
base_addr
+
regoffs
)
&
mask
)
==
value
)
return
1
;
...
...
@@ -202,7 +205,7 @@ static int wait_timeout(struct IBMLANA_NETDEV *dev, int regoffs, u16 mask,
/* reset the whole board */
static
void
ResetBoard
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
ResetBoard
(
struct
net_device
*
dev
)
{
unsigned
char
bcmval
;
...
...
@@ -226,7 +229,7 @@ static void ResetBoard(struct IBMLANA_NETDEV *dev)
/* calculate RAM layout & set up descriptors in RAM */
static
void
InitDscrs
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
InitDscrs
(
struct
net_device
*
dev
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
u32
addr
,
baddr
,
raddr
;
...
...
@@ -237,7 +240,7 @@ static void InitDscrs(struct IBMLANA_NETDEV *dev)
/* initialize RAM */
IBMLANA_SETIO
(
dev
->
mem_start
,
0xaa
,
isa_memset_io
(
dev
->
mem_start
,
0xaa
,
dev
->
mem_start
-
dev
->
mem_start
);
/* setup n TX descriptors - independent of RAM size */
...
...
@@ -257,29 +260,27 @@ static void InitDscrs(struct IBMLANA_NETDEV *dev)
else
tda
.
link
=
addr
+
sizeof
(
tda_t
);
tda
.
link
|=
1
;
IBMLANA_TOIO
(
dev
->
mem_start
+
addr
,
&
tda
,
sizeof
(
tda_t
));
isa_memcpy_to_io
(
dev
->
mem_start
+
addr
,
&
tda
,
sizeof
(
tda_t
));
addr
+=
sizeof
(
tda_t
);
baddr
+=
PKTSIZE
;
}
/* calculate how many receive buffers fit into remaining memory */
priv
->
rxbufcnt
=
(
dev
->
mem_end
-
dev
->
mem_start
-
baddr
)
/
(
sizeof
(
rra_t
)
+
sizeof
(
rda_t
)
+
PKTSIZE
);
priv
->
rxbufcnt
=
(
dev
->
mem_end
-
dev
->
mem_start
-
baddr
)
/
(
sizeof
(
rra_t
)
+
sizeof
(
rda_t
)
+
PKTSIZE
);
/* calculate receive addresses */
priv
->
rrastart
=
raddr
=
priv
->
txbufstart
+
(
TXBUFCNT
*
PKTSIZE
);
priv
->
rdastart
=
addr
=
priv
->
rrastart
+
(
priv
->
rxbufcnt
*
sizeof
(
rra_t
));
priv
->
rxbufstart
=
baddr
=
priv
->
rdastart
+
(
priv
->
rxbufcnt
*
sizeof
(
rda_t
));
priv
->
rdastart
=
addr
=
priv
->
rrastart
+
(
priv
->
rxbufcnt
*
sizeof
(
rra_t
));
priv
->
rxbufstart
=
baddr
=
priv
->
rdastart
+
(
priv
->
rxbufcnt
*
sizeof
(
rda_t
));
for
(
z
=
0
;
z
<
priv
->
rxbufcnt
;
z
++
)
{
rra
.
startlo
=
baddr
;
rra
.
starthi
=
0
;
rra
.
cntlo
=
PKTSIZE
>>
1
;
rra
.
cnthi
=
0
;
IBMLANA_TOIO
(
dev
->
mem_start
+
raddr
,
&
rra
,
sizeof
(
rra_t
));
isa_memcpy_to_io
(
dev
->
mem_start
+
raddr
,
&
rra
,
sizeof
(
rra_t
));
rda
.
status
=
0
;
rda
.
length
=
0
;
...
...
@@ -291,7 +292,7 @@ static void InitDscrs(struct IBMLANA_NETDEV *dev)
else
rda
.
link
=
1
;
rda
.
inuse
=
1
;
IBMLANA_TOIO
(
dev
->
mem_start
+
addr
,
&
rda
,
sizeof
(
rda_t
));
isa_memcpy_to_io
(
dev
->
mem_start
+
addr
,
&
rda
,
sizeof
(
rda_t
));
baddr
+=
PKTSIZE
;
raddr
+=
sizeof
(
rra_t
);
...
...
@@ -310,7 +311,7 @@ static void InitDscrs(struct IBMLANA_NETDEV *dev)
/* set up Rx + Tx descriptors in SONIC */
static
int
InitSONIC
(
struct
IBMLANA_NETDEV
*
dev
)
static
int
InitSONIC
(
struct
net_device
*
dev
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
...
...
@@ -318,8 +319,7 @@ static int InitSONIC(struct IBMLANA_NETDEV *dev)
outw
(
0
,
SONIC_URRA
);
outw
(
priv
->
rrastart
,
dev
->
base_addr
+
SONIC_RSA
);
outw
(
priv
->
rrastart
+
(
priv
->
rxbufcnt
*
sizeof
(
rra_t
)),
dev
->
base_addr
+
SONIC_REA
);
outw
(
priv
->
rrastart
+
(
priv
->
rxbufcnt
*
sizeof
(
rra_t
)),
dev
->
base_addr
+
SONIC_REA
);
outw
(
priv
->
rrastart
,
dev
->
base_addr
+
SONIC_RRP
);
outw
(
priv
->
rrastart
,
dev
->
base_addr
+
SONIC_RWP
);
...
...
@@ -331,9 +331,7 @@ static int InitSONIC(struct IBMLANA_NETDEV *dev)
outw
(
CMDREG_RRRA
,
dev
->
base_addr
+
SONIC_CMDREG
);
if
(
!
wait_timeout
(
dev
,
SONIC_CMDREG
,
CMDREG_RRRA
,
0
,
2
))
{
printk
(
"%s: SONIC did not respond on RRRA command - giving up."
,
dev
->
name
);
printk
(
KERN_ERR
"%s: SONIC did not respond on RRRA command - giving up."
,
dev
->
name
);
return
0
;
}
...
...
@@ -351,12 +349,11 @@ static int InitSONIC(struct IBMLANA_NETDEV *dev)
/* stop SONIC so we can reinitialize it */
static
void
StopSONIC
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
StopSONIC
(
struct
net_device
*
dev
)
{
/* disable interrupts */
outb
(
inb
(
dev
->
base_addr
+
BCMREG
)
&
(
~
BCMREG_IEN
),
dev
->
base_addr
+
BCMREG
);
outb
(
inb
(
dev
->
base_addr
+
BCMREG
)
&
(
~
BCMREG_IEN
),
dev
->
base_addr
+
BCMREG
);
outb
(
0
,
dev
->
base_addr
+
SONIC_IMREG
);
/* reset the SONIC */
...
...
@@ -380,7 +377,7 @@ static void putcam(camentry_t * cams, int *camcnt, char *addr)
(
*
camcnt
)
++
;
}
static
void
InitBoard
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
InitBoard
(
struct
net_device
*
dev
)
{
int
camcnt
;
camentry_t
cams
[
16
];
...
...
@@ -395,14 +392,12 @@ static void InitBoard(struct IBMLANA_NETDEV *dev)
/* clear all spurious interrupts */
outw
(
inw
(
dev
->
base_addr
+
SONIC_ISREG
),
dev
->
base_addr
+
SONIC_ISREG
);
outw
(
inw
(
dev
->
base_addr
+
SONIC_ISREG
),
dev
->
base_addr
+
SONIC_ISREG
);
/* set up the SONIC's bus interface - constant for this adapter -
must be done while the SONIC is in reset */
outw
(
DCREG_USR1
|
DCREG_USR0
|
DCREG_WC1
|
DCREG_DW32
,
dev
->
base_addr
+
SONIC_DCREG
);
outw
(
DCREG_USR1
|
DCREG_USR0
|
DCREG_WC1
|
DCREG_DW32
,
dev
->
base_addr
+
SONIC_DCREG
);
outw
(
0
,
dev
->
base_addr
+
SONIC_DCREG2
);
/* remove reset form the SONIC */
...
...
@@ -434,9 +429,8 @@ static void InitBoard(struct IBMLANA_NETDEV *dev)
/* feed CDA into SONIC, initialize RCR value (always get broadcasts) */
IBMLANA_TOIO
(
dev
->
mem_start
,
cams
,
sizeof
(
camentry_t
)
*
camcnt
);
IBMLANA_TOIO
(
dev
->
mem_start
+
(
sizeof
(
camentry_t
)
*
camcnt
),
&
cammask
,
sizeof
(
cammask
));
isa_memcpy_to_io
(
dev
->
mem_start
,
cams
,
sizeof
(
camentry_t
)
*
camcnt
);
isa_memcpy_to_io
(
dev
->
mem_start
+
(
sizeof
(
camentry_t
)
*
camcnt
),
&
cammask
,
sizeof
(
cammask
));
#ifdef DEBUG
printk
(
"CAM setup:
\n
"
);
...
...
@@ -447,9 +441,7 @@ static void InitBoard(struct IBMLANA_NETDEV *dev)
outw
(
camcnt
,
dev
->
base_addr
+
SONIC_CAMCNT
);
outw
(
CMDREG_LCAM
,
dev
->
base_addr
+
SONIC_CMDREG
);
if
(
!
wait_timeout
(
dev
,
SONIC_CMDREG
,
CMDREG_LCAM
,
0
,
2
))
{
printk
(
"%s:SONIC did not respond on LCAM command - giving up."
,
dev
->
name
);
printk
(
KERN_ERR
"%s:SONIC did not respond on LCAM command - giving up."
,
dev
->
name
);
return
;
}
else
{
/* clear interrupt condition */
...
...
@@ -470,12 +462,9 @@ static void InitBoard(struct IBMLANA_NETDEV *dev)
for
(
z
=
0
;
z
<
camcnt
;
z
++
)
{
outw
(
z
,
dev
->
base_addr
+
SONIC_CAMEPTR
);
printk
(
"Entry %d: %04x %04x %04x
\n
"
,
z
,
inw
(
dev
->
base_addr
+
SONIC_CAMADDR0
),
inw
(
dev
->
base_addr
+
SONIC_CAMADDR1
),
inw
(
dev
->
base_addr
+
SONIC_CAMADDR2
));
inw
(
dev
->
base_addr
+
SONIC_CAMADDR0
),
inw
(
dev
->
base_addr
+
SONIC_CAMADDR1
),
inw
(
dev
->
base_addr
+
SONIC_CAMADDR2
));
}
outw
(
0
,
dev
->
base_addr
+
SONIC_CMDREG
);
}
...
...
@@ -515,13 +504,11 @@ static void InitBoard(struct IBMLANA_NETDEV *dev)
/* enable transmitter + receiver interrupts */
outw
(
CMDREG_RXEN
,
dev
->
base_addr
+
SONIC_CMDREG
);
outw
(
IMREG_PRXEN
|
IMREG_RBEEN
|
IMREG_PTXEN
|
IMREG_TXEREN
,
dev
->
base_addr
+
SONIC_IMREG
);
outw
(
IMREG_PRXEN
|
IMREG_RBEEN
|
IMREG_PTXEN
|
IMREG_TXEREN
,
dev
->
base_addr
+
SONIC_IMREG
);
/* turn on card interrupts */
outb
(
inb
(
dev
->
base_addr
+
BCMREG
)
|
BCMREG_IEN
,
dev
->
base_addr
+
BCMREG
);
outb
(
inb
(
dev
->
base_addr
+
BCMREG
)
|
BCMREG_IEN
,
dev
->
base_addr
+
BCMREG
);
#ifdef DEBUG
printk
(
"Register dump after initialization:
\n
"
);
...
...
@@ -531,7 +518,7 @@ static void InitBoard(struct IBMLANA_NETDEV *dev)
/* start transmission of a descriptor */
static
void
StartTx
(
struct
IBMLANA_NETDEV
*
dev
,
int
descr
)
static
void
StartTx
(
struct
net_device
*
dev
,
int
descr
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
int
addr
;
...
...
@@ -554,7 +541,7 @@ static void StartTx(struct IBMLANA_NETDEV *dev, int descr)
/* receive buffer area exhausted */
static
void
irqrbe_handler
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
irqrbe_handler
(
struct
net_device
*
dev
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
...
...
@@ -566,7 +553,7 @@ static void irqrbe_handler(struct IBMLANA_NETDEV *dev)
/* receive interrupt */
static
void
irqrx_handler
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
irqrx_handler
(
struct
net_device
*
dev
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
rda_t
rda
;
...
...
@@ -577,12 +564,9 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev)
while
(
1
)
{
/* read descriptor that was next to be filled by SONIC */
rdaaddr
=
priv
->
rdastart
+
(
priv
->
nextrxdescr
*
sizeof
(
rda_t
));
lrdaaddr
=
priv
->
rdastart
+
(
priv
->
lastrxdescr
*
sizeof
(
rda_t
));
IBMLANA_FROMIO
(
&
rda
,
dev
->
mem_start
+
rdaaddr
,
sizeof
(
rda_t
));
rdaaddr
=
priv
->
rdastart
+
(
priv
->
nextrxdescr
*
sizeof
(
rda_t
));
lrdaaddr
=
priv
->
rdastart
+
(
priv
->
lastrxdescr
*
sizeof
(
rda_t
));
isa_memcpy_fromio
(
&
rda
,
dev
->
mem_start
+
rdaaddr
,
sizeof
(
rda_t
));
/* iron out upper word halves of fields we use - SONIC will duplicate
bits 0..15 to 16..31 */
...
...
@@ -609,7 +593,7 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev)
else
{
/* copy out data */
IBMLANA_FROMIO
(
skb_put
(
skb
,
rda
.
length
),
isa_memcpy_fromio
(
skb_put
(
skb
,
rda
.
length
),
dev
->
mem_start
+
rda
.
startlo
,
rda
.
length
);
...
...
@@ -620,15 +604,11 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev)
skb
->
ip_summed
=
CHECKSUM_NONE
;
/* bookkeeping */
dev
->
last_rx
=
jiffies
;
priv
->
stat
.
rx_packets
++
;
#if (LINUX_VERSION_CODE >= 0x20119)
/* byte counters for kernel >= 2.1.25 */
priv
->
stat
.
rx_bytes
+=
rda
.
length
;
#endif
/* pass to the upper layers */
netif_rx
(
skb
);
}
}
...
...
@@ -637,10 +617,8 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev)
else
{
priv
->
stat
.
rx_errors
++
;
if
(
rda
.
status
&
RCREG_FAER
)
priv
->
stat
.
rx_frame_errors
++
;
if
(
rda
.
status
&
RCREG_CRCR
)
priv
->
stat
.
rx_crc_errors
++
;
}
...
...
@@ -649,14 +627,14 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev)
rda
.
link
=
1
;
rda
.
inuse
=
1
;
IBMLANA_TOIO
(
dev
->
mem_start
+
rdaaddr
,
&
rda
,
isa_memcpy_to_io
(
dev
->
mem_start
+
rdaaddr
,
&
rda
,
sizeof
(
rda_t
));
/* set up link and EOL = 0 in currently last descriptor. Only write
the link field since the SONIC may currently already access the
other fields. */
IBMLANA_TOIO
(
dev
->
mem_start
+
lrdaaddr
+
20
,
&
rdaaddr
,
4
);
isa_memcpy_to_io
(
dev
->
mem_start
+
lrdaaddr
+
20
,
&
rdaaddr
,
4
);
/* advance indices */
...
...
@@ -668,57 +646,39 @@ static void irqrx_handler(struct IBMLANA_NETDEV *dev)
/* transmit interrupt */
static
void
irqtx_handler
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
irqtx_handler
(
struct
net_device
*
dev
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
tda_t
tda
;
/* fetch descriptor (we forgot the size ;-) */
IBMLANA_FROMIO
(
&
tda
,
dev
->
mem_start
+
priv
->
tdastart
+
(
priv
->
currtxdescr
*
sizeof
(
tda_t
)),
sizeof
(
tda_t
));
isa_memcpy_fromio
(
&
tda
,
dev
->
mem_start
+
priv
->
tdastart
+
(
priv
->
currtxdescr
*
sizeof
(
tda_t
)),
sizeof
(
tda_t
));
/* update statistics */
priv
->
stat
.
tx_packets
++
;
#if (LINUX_VERSION_CODE >= 0x020119)
priv
->
stat
.
tx_bytes
+=
tda
.
length
;
#endif
/* update our pointers */
priv
->
txused
[
priv
->
currtxdescr
]
=
0
;
priv
->
txusedcnt
--
;
/* if there are more descriptors present in RAM, start them */
if
(
priv
->
txusedcnt
>
0
)
StartTx
(
dev
,
(
priv
->
currtxdescr
+
1
)
%
TXBUFCNT
);
/* tell the upper layer we can go on transmitting */
#if LINUX_VERSION_CODE >= 0x02032a
netif_wake_queue
(
dev
);
#else
dev
->
tbusy
=
0
;
mark_bh
(
NET_BH
);
#endif
}
static
void
irqtxerr_handler
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
irqtxerr_handler
(
struct
net_device
*
dev
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
tda_t
tda
;
/* fetch descriptor to check status */
IBMLANA_FROMIO
(
&
tda
,
dev
->
mem_start
+
priv
->
tdastart
+
(
priv
->
currtxdescr
*
sizeof
(
tda_t
)),
sizeof
(
tda_t
));
isa_memcpy_fromio
(
&
tda
,
dev
->
mem_start
+
priv
->
tdastart
+
(
priv
->
currtxdescr
*
sizeof
(
tda_t
)),
sizeof
(
tda_t
));
/* update statistics */
priv
->
stat
.
tx_errors
++
;
if
(
tda
.
status
&
(
TCREG_NCRS
|
TCREG_CRSL
))
priv
->
stat
.
tx_carrier_errors
++
;
...
...
@@ -730,47 +690,29 @@ static void irqtxerr_handler(struct IBMLANA_NETDEV *dev)
priv
->
stat
.
tx_fifo_errors
++
;
/* update our pointers */
priv
->
txused
[
priv
->
currtxdescr
]
=
0
;
priv
->
txusedcnt
--
;
/* if there are more descriptors present in RAM, start them */
if
(
priv
->
txusedcnt
>
0
)
StartTx
(
dev
,
(
priv
->
currtxdescr
+
1
)
%
TXBUFCNT
);
/* tell the upper layer we can go on transmitting */
#if LINUX_VERSION_CODE >= 0x02032a
netif_wake_queue
(
dev
);
#else
dev
->
tbusy
=
0
;
mark_bh
(
NET_BH
);
#endif
}
/* general interrupt entry */
static
void
irq_handler
(
int
irq
,
void
*
device
,
struct
pt_regs
*
regs
)
{
struct
IBMLANA_NETDEV
*
dev
=
(
struct
IBMLANA_NETDEV
*
)
device
;
struct
net_device
*
dev
=
(
struct
net_device
*
)
device
;
u16
ival
;
/* in case we're not meant... */
if
(
!
(
inb
(
dev
->
base_addr
+
BCMREG
)
&
BCMREG_IPEND
))
return
;
#if (LINUX_VERSION_CODE >= 0x02032a)
#if 0
set_bit(LINK_STATE_RXSEM, &dev->state);
#endif
#else
dev
->
interrupt
=
1
;
#endif
/* loop through the interrupt bits until everything is clear */
while
(
1
)
{
ival
=
inw
(
dev
->
base_addr
+
SONIC_ISREG
);
...
...
@@ -778,32 +720,20 @@ static void irq_handler(int irq, void *device, struct pt_regs *regs)
irqrbe_handler
(
dev
);
outw
(
ISREG_RBE
,
dev
->
base_addr
+
SONIC_ISREG
);
}
if
(
ival
&
ISREG_PKTRX
)
{
irqrx_handler
(
dev
);
outw
(
ISREG_PKTRX
,
dev
->
base_addr
+
SONIC_ISREG
);
}
if
(
ival
&
ISREG_TXDN
)
{
irqtx_handler
(
dev
);
outw
(
ISREG_TXDN
,
dev
->
base_addr
+
SONIC_ISREG
);
}
if
(
ival
&
ISREG_TXER
)
{
irqtxerr_handler
(
dev
);
outw
(
ISREG_TXER
,
dev
->
base_addr
+
SONIC_ISREG
);
}
break
;
}
#if (LINUX_VERSION_CODE >= 0x02032a)
#if 0
clear_bit(LINK_STATE_RXSEM, &dev->state);
#endif
#else
dev
->
interrupt
=
0
;
#endif
}
/* ------------------------------------------------------------------------
...
...
@@ -815,7 +745,7 @@ static void irq_handler(int irq, void *device, struct pt_regs *regs)
static
int
ibmlana_getinfo
(
char
*
buf
,
int
slot
,
void
*
d
)
{
int
len
=
0
,
i
;
struct
IBMLANA_NETDEV
*
dev
=
(
struct
IBMLANA_NETDEV
*
)
d
;
struct
net_device
*
dev
=
(
struct
net_device
*
)
d
;
ibmlana_priv
*
priv
;
/* can't say anything about an uninitialized device... */
...
...
@@ -830,11 +760,8 @@ static int ibmlana_getinfo(char *buf, int slot, void *d)
len
+=
sprintf
(
buf
+
len
,
"IRQ: %d
\n
"
,
priv
->
realirq
);
len
+=
sprintf
(
buf
+
len
,
"I/O: %#lx
\n
"
,
dev
->
base_addr
);
len
+=
sprintf
(
buf
+
len
,
"Memory: %#lx-%#lx
\n
"
,
dev
->
mem_start
,
dev
->
mem_end
-
1
);
len
+=
sprintf
(
buf
+
len
,
"Transceiver: %s
\n
"
,
MediaNames
[
priv
->
medium
]);
len
+=
sprintf
(
buf
+
len
,
"Memory: %#lx-%#lx
\n
"
,
dev
->
mem_start
,
dev
->
mem_end
-
1
);
len
+=
sprintf
(
buf
+
len
,
"Transceiver: %s
\n
"
,
MediaNames
[
priv
->
medium
]);
len
+=
sprintf
(
buf
+
len
,
"Device: %s
\n
"
,
dev
->
name
);
len
+=
sprintf
(
buf
+
len
,
"MAC address:"
);
for
(
i
=
0
;
i
<
6
;
i
++
)
...
...
@@ -847,44 +774,31 @@ static int ibmlana_getinfo(char *buf, int slot, void *d)
/* open driver. Means also initialization and start of LANCE */
static
int
ibmlana_open
(
struct
IBMLANA_NETDEV
*
dev
)
static
int
ibmlana_open
(
struct
net_device
*
dev
)
{
int
result
;
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
/* register resources - only necessary for IRQ */
result
=
request_irq
(
priv
->
realirq
,
irq_handler
,
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
dev
->
name
,
dev
);
result
=
request_irq
(
priv
->
realirq
,
irq_handler
,
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
dev
->
name
,
dev
);
if
(
result
!=
0
)
{
printk
(
"%s: failed to register irq %d
\n
"
,
dev
->
name
,
dev
->
irq
);
printk
(
KERN_ERR
"%s: failed to register irq %d
\n
"
,
dev
->
name
,
dev
->
irq
);
return
result
;
}
dev
->
irq
=
priv
->
realirq
;
/* set up the card and SONIC */
InitBoard
(
dev
);
/* initialize operational flags */
#if (LINUX_VERSION_CODE >= 0x02032a)
netif_start_queue
(
dev
);
#else
dev
->
interrupt
=
0
;
dev
->
tbusy
=
0
;
dev
->
start
=
1
;
MOD_INC_USE_COUNT
;
#endif
return
0
;
}
/* close driver. Shut down board and free allocated resources */
static
int
ibmlana_close
(
struct
IBMLANA_NETDEV
*
dev
)
static
int
ibmlana_close
(
struct
net_device
*
dev
)
{
/* turn off board */
...
...
@@ -892,17 +806,12 @@ static int ibmlana_close(struct IBMLANA_NETDEV *dev)
if
(
dev
->
irq
!=
0
)
free_irq
(
dev
->
irq
,
dev
);
dev
->
irq
=
0
;
#if (LINUX_VERSION_CODE < 0x02032a)
MOD_DEC_USE_COUNT
;
#endif
return
0
;
}
/* transmit a block. */
static
int
ibmlana_tx
(
struct
sk_buff
*
skb
,
struct
IBMLANA_NETDEV
*
dev
)
static
int
ibmlana_tx
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
int
retval
=
0
,
tmplen
,
addr
;
...
...
@@ -910,16 +819,6 @@ static int ibmlana_tx(struct sk_buff *skb, struct IBMLANA_NETDEV *dev)
tda_t
tda
;
int
baddr
;
/* if we get called with a NULL descriptor, the Ethernet layer thinks
our card is stuck an we should reset it. We'll do this completely: */
if
(
skb
==
NULL
)
{
printk
(
"%s: Resetting SONIC
\n
"
,
dev
->
name
);
StopSONIC
(
dev
);
InitBoard
(
dev
);
return
0
;
/* don't try to free the block here ;-) */
}
/* find out if there are free slots for a frame to transmit. If not,
the upper layer is in deep desperation and we simply ignore the frame. */
...
...
@@ -930,12 +829,11 @@ static int ibmlana_tx(struct sk_buff *skb, struct IBMLANA_NETDEV *dev)
}
/* copy the frame data into the next free transmit buffer - fillup missing */
tmplen
=
skb
->
len
;
if
(
tmplen
<
60
)
tmplen
=
60
;
baddr
=
priv
->
txbufstart
+
(
priv
->
nexttxdescr
*
PKTSIZE
);
IBMLANA_TOIO
(
dev
->
mem_start
+
baddr
,
skb
->
data
,
skb
->
len
);
isa_memcpy_to_io
(
dev
->
mem_start
+
baddr
,
skb
->
data
,
skb
->
len
);
/* copy filler into RAM - in case we're filling up...
we're filling a bit more than necessary, but that doesn't harm
...
...
@@ -947,81 +845,60 @@ static int ibmlana_tx(struct sk_buff *skb, struct IBMLANA_NETDEV *dev)
unsigned
int
destoffs
=
skb
->
len
,
l
=
strlen
(
fill
);
while
(
destoffs
<
tmplen
)
{
IBMLANA_TOIO
(
dev
->
mem_start
+
baddr
+
destoffs
,
fill
,
l
);
isa_memcpy_to_io
(
dev
->
mem_start
+
baddr
+
destoffs
,
fill
,
l
);
destoffs
+=
l
;
}
}
/* set up the new frame descriptor */
addr
=
priv
->
tdastart
+
(
priv
->
nexttxdescr
*
sizeof
(
tda_t
));
IBMLANA_FROMIO
(
&
tda
,
dev
->
mem_start
+
addr
,
sizeof
(
tda_t
));
isa_memcpy_fromio
(
&
tda
,
dev
->
mem_start
+
addr
,
sizeof
(
tda_t
));
tda
.
length
=
tda
.
fraglength
=
tmplen
;
IBMLANA_TOIO
(
dev
->
mem_start
+
addr
,
&
tda
,
sizeof
(
tda_t
));
isa_memcpy_to_io
(
dev
->
mem_start
+
addr
,
&
tda
,
sizeof
(
tda_t
));
/* if there were no active descriptors, trigger the SONIC */
save_flags
(
flags
);
cli
();
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
priv
->
txusedcnt
++
;
priv
->
txused
[
priv
->
nexttxdescr
]
=
1
;
/* are all transmission slots used up ? */
if
(
priv
->
txusedcnt
>=
TXBUFCNT
)
#if (LINUX_VERSION_CODE >= 0x02032a)
netif_stop_queue
(
dev
);
#else
dev
->
tbusy
=
1
;
#endif
if
(
priv
->
txusedcnt
==
1
)
StartTx
(
dev
,
priv
->
nexttxdescr
);
priv
->
nexttxdescr
=
(
priv
->
nexttxdescr
+
1
)
%
TXBUFCNT
;
restore_flags
(
flags
);
tx_done:
/* When did that change exactly ? */
#if (LINUX_VERSION_CODE >= 0x20200)
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
tx_done:
dev_kfree_skb
(
skb
);
#else
dev_kfree_skb
(
skb
,
FREE_WRITE
);
#endif
return
retval
;
}
/* return pointer to Ethernet statistics */
static
struct
net_device_stats
*
ibmlana_stats
(
struct
IBMLANA_NETDEV
*
dev
)
static
struct
net_device_stats
*
ibmlana_stats
(
struct
net_device
*
dev
)
{
ibmlana_priv
*
priv
=
(
ibmlana_priv
*
)
dev
->
priv
;
return
&
(
priv
->
stat
);
return
&
priv
->
stat
;
}
/* we don't support runtime reconfiguration, since am MCA card can
be unambigously identified by its POS registers. */
static
int
ibmlana_config
(
struct
IBMLANA_NETDEV
*
dev
,
struct
ifmap
*
map
)
static
int
ibmlana_config
(
struct
net_device
*
dev
,
struct
ifmap
*
map
)
{
return
0
;
}
/* switch receiver mode. */
static
void
ibmlana_set_multicast_list
(
struct
IBMLANA_NETDEV
*
dev
)
static
void
ibmlana_set_multicast_list
(
struct
net_device
*
dev
)
{
/* first stop the SONIC... */
StopSONIC
(
dev
);
/* ...then reinit it with the new flags */
InitBoard
(
dev
);
}
...
...
@@ -1031,7 +908,7 @@ static void ibmlana_set_multicast_list(struct IBMLANA_NETDEV *dev)
static
int
startslot
;
/* counts through slots when probing multiple devices */
int
ibmlana_probe
(
struct
IBMLANA_NETDEV
*
dev
)
int
ibmlana_probe
(
struct
net_device
*
dev
)
{
int
force_detect
=
0
;
int
slot
,
z
;
...
...
@@ -1039,22 +916,17 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev)
ibmlana_priv
*
priv
;
ibmlana_medium
medium
;
#if (LINUX_VERSION_CODE >= 0x02032a)
SET_MODULE_OWNER
(
dev
);
#endif
/* can't work without an MCA bus ;-) */
if
(
MCA_bus
==
0
)
return
-
ENODEV
;
/* start address of 1 --> forced detection */
if
(
dev
->
mem_start
==
1
)
force_detect
=
1
;
/* search through slots */
if
(
dev
!=
NULL
)
{
base
=
dev
->
mem_start
;
irq
=
dev
->
irq
;
...
...
@@ -1063,70 +935,51 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev)
while
(
slot
!=
-
1
)
{
/* deduce card addresses */
getaddrs
(
slot
,
&
base
,
&
memlen
,
&
iobase
,
&
irq
,
&
medium
);
#if (LINUX_VERSION_CODE >= 0x20300)
/* slot already in use ? */
if
(
mca_is_adapter_used
(
slot
))
{
slot
=
mca_find_adapter
(
IBM_LANA_ID
,
slot
+
1
);
continue
;
}
#endif
/* were we looking for something different ? */
if
((
dev
->
irq
!=
0
)
||
(
dev
->
mem_start
!=
0
))
{
if
((
dev
->
irq
!=
0
)
&&
(
dev
->
irq
!=
irq
))
{
slot
=
mca_find_adapter
(
IBM_LANA_ID
,
slot
+
1
);
if
(
dev
->
irq
!=
0
||
dev
->
mem_start
!=
0
)
{
if
(
dev
->
irq
!=
0
&&
dev
->
irq
!=
irq
)
{
slot
=
mca_find_adapter
(
IBM_LANA_ID
,
slot
+
1
);
continue
;
}
if
((
dev
->
mem_start
!=
0
)
&&
(
dev
->
mem_start
!=
base
))
{
slot
=
mca_find_adapter
(
IBM_LANA_ID
,
slot
+
1
);
if
(
dev
->
mem_start
!=
0
&&
dev
->
mem_start
!=
base
)
{
slot
=
mca_find_adapter
(
IBM_LANA_ID
,
slot
+
1
);
continue
;
}
}
/* found something that matches */
break
;
}
/* nothing found ? */
if
(
slot
==
-
1
)
return
(
(
base
!=
0
)
||
(
irq
!=
0
)
)
?
-
ENXIO
:
-
ENODEV
;
return
(
base
!=
0
||
irq
!=
0
)
?
-
ENXIO
:
-
ENODEV
;
/* announce success */
printk
(
"%s: IBM LAN Adapter/A found in slot %d
\n
"
,
dev
->
name
,
slot
+
1
);
printk
(
KERN_INFO
"%s: IBM LAN Adapter/A found in slot %d
\n
"
,
dev
->
name
,
slot
+
1
);
/* try to obtain I/O range */
if
(
!
request_region
(
iobase
,
IBM_LANA_IORANGE
,
dev
->
name
))
{
printk
(
"%s: cannot allocate I/O range at %#x!
\n
"
,
dev
->
name
,
iobase
);
printk
(
KERN_ERR
"%s: cannot allocate I/O range at %#x!
\n
"
,
dev
->
name
,
iobase
);
startslot
=
slot
+
1
;
return
-
EBUSY
;
}
/* make procfs entries */
mca_set_adapter_name
(
slot
,
"IBM LAN Adapter/A"
);
mca_set_adapter_procfn
(
slot
,
(
MCA_ProcFn
)
ibmlana_getinfo
,
dev
);
#if (LINUX_VERSION_CODE >= 0x20200)
mca_mark_as_used
(
slot
);
#endif
/* allocate structure */
priv
=
dev
->
priv
=
(
ibmlana_priv
*
)
kmalloc
(
sizeof
(
ibmlana_priv
),
GFP_KERNEL
);
priv
=
dev
->
priv
=
(
ibmlana_priv
*
)
kmalloc
(
sizeof
(
ibmlana_priv
),
GFP_KERNEL
);
if
(
!
priv
)
{
release_region
(
iobase
,
IBM_LANA_IORANGE
);
return
-
ENOMEM
;
...
...
@@ -1134,7 +987,8 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev)
priv
->
slot
=
slot
;
priv
->
realirq
=
irq
;
priv
->
medium
=
medium
;
memset
(
&
(
priv
->
stat
),
0
,
sizeof
(
struct
net_device_stats
));
spin_lock_init
(
&
priv
->
lock
);
memset
(
&
priv
->
stat
,
0
,
sizeof
(
struct
net_device_stats
));
/* set base + irq for this device (irq not allocated so far) */
...
...
@@ -1165,13 +1019,13 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev)
/* print config */
printk
(
"%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, "
printk
(
KERN_INFO
"%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, "
"MAC address %02x:%02x:%02x:%02x:%02x:%02x.
\n
"
,
dev
->
name
,
priv
->
realirq
,
dev
->
base_addr
,
dev
->
mem_start
,
dev
->
mem_end
-
1
,
dev
->
dev_addr
[
0
],
dev
->
dev_addr
[
1
],
dev
->
dev_addr
[
2
],
dev
->
dev_addr
[
3
],
dev
->
dev_addr
[
4
],
dev
->
dev_addr
[
5
]);
printk
(
"%s: %s medium
\n
"
,
dev
->
name
,
MediaNames
[
priv
->
medium
]);
printk
(
KERN_INFO
"%s: %s medium
\n
"
,
dev
->
name
,
MediaNames
[
priv
->
medium
]);
/* reset board */
...
...
@@ -1192,9 +1046,10 @@ int ibmlana_probe(struct IBMLANA_NETDEV *dev)
#define DEVMAX 5
static
struct
IBMLANA_NETDEV
moddevs
[
DEVMAX
];
static
struct
net_device
moddevs
[
DEVMAX
];
static
int
irq
;
static
int
io
;
MODULE_PARM
(
irq
,
"i"
);
MODULE_PARM
(
io
,
"i"
);
MODULE_PARM_DESC
(
irq
,
"IBM LAN/A IRQ number"
);
...
...
@@ -1214,21 +1069,15 @@ int init_module(void)
if
(
res
!=
0
)
return
(
z
>
0
)
?
0
:
-
EIO
;
}
return
0
;
}
void
cleanup_module
(
void
)
{
struct
IBMLANA_NETDEV
*
dev
;
struct
net_device
*
dev
;
ibmlana_priv
*
priv
;
int
z
;
if
(
MOD_IN_USE
)
{
printk
(
"cannot unload, module in use
\n
"
);
return
;
}
for
(
z
=
0
;
z
<
DEVMAX
;
z
++
)
{
dev
=
moddevs
+
z
;
if
(
dev
->
priv
!=
NULL
)
{
...
...
@@ -1239,9 +1088,7 @@ void cleanup_module(void)
dev
->
irq
=
0
;
release_region
(
dev
->
base_addr
,
IBM_LANA_IORANGE
);
unregister_netdev
(
dev
);
#if (LINUX_VERSION_CODE >= 0x20200)
mca_mark_as_unused
(
priv
->
slot
);
#endif
mca_set_adapter_name
(
priv
->
slot
,
""
);
mca_set_adapter_procfn
(
priv
->
slot
,
NULL
,
NULL
);
kfree
(
dev
->
priv
);
...
...
drivers/net/ibmlana.h
View file @
ee29d109
...
...
@@ -3,22 +3,6 @@
#ifdef _IBM_LANA_DRIVER_
/* version-dependent functions/structures */
#if LINUX_VERSION_CODE >= 0x020318
#define IBMLANA_READB(addr) isa_readb(addr)
#define IBMLANA_TOIO(dest, src, len) isa_memcpy_toio(dest, src, len)
#define IBMLANA_FROMIO(dest, src, len) isa_memcpy_fromio(dest, src, len)
#define IBMLANA_SETIO(dest, val, len) isa_memset_io(dest, val, len)
#define IBMLANA_NETDEV net_device
#else
#define IBMLANA_READB(addr) readb(addr)
#define IBMLANA_TOIO(dest, src, len) memcpy_toio(dest, src, len)
#define IBMLANA_FROMIO(dest, src, len) memcpy_fromio(dest, src, len)
#define IBMLANA_SETIO(dest, val, len) memset_io(dest, val, len)
#define IBMLANA_NETDEV device
#endif
/* maximum packet size */
#define PKTSIZE 1524
...
...
@@ -33,7 +17,8 @@
/* media enumeration - defined in a way that it fits onto the LAN/A's
POS registers... */
typedef
enum
{
Media_10BaseT
,
Media_10Base5
,
typedef
enum
{
Media_10BaseT
,
Media_10Base5
,
Media_Unknown
,
Media_10Base2
,
Media_Count
}
ibmlana_medium
;
...
...
@@ -52,6 +37,7 @@ typedef struct {
nexttxdescr
,
/* last tx descriptor to be used */
currtxdescr
,
/* tx descriptor currently tx'ed */
txused
[
TXBUFCNT
];
/* busy flags */
spinlock_t
lock
;
}
ibmlana_priv
;
/* this card uses quite a lot of I/O ports...luckily the MCA bus decodes
...
...
@@ -289,7 +275,7 @@ typedef struct {
#endif
/* _IBM_LANA_DRIVER_ */
extern
int
ibmlana_probe
(
struct
IBMLANA_NETDEV
*
);
extern
int
ibmlana_probe
(
struct
net_device
*
);
#endif
/* _IBM_LANA_INCLUDE_ */
drivers/net/tokenring/3c359.c
View file @
ee29d109
...
...
@@ -1780,7 +1780,7 @@ static int xl_change_mtu(struct net_device *dev, int mtu)
static
void
__devexit
xl_remove_one
(
struct
pci_dev
*
pdev
)
{
struct
net_device
*
dev
=
p
dev
->
driver_data
;
struct
net_device
*
dev
=
p
ci_get_drvdata
(
pdev
)
;
struct
xl_private
*
xl_priv
=
(
struct
xl_private
*
)
dev
->
priv
;
unregister_trdev
(
dev
);
...
...
drivers/net/tokenring/smctr.c
View file @
ee29d109
...
...
@@ -24,13 +24,12 @@
*
* To do:
* 1. Multicast support.
*
* Initial 2.5 cleanup Alan Cox <alan@redhat.com> 2002/10/28
*/
#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
#endif
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/sched.h>
...
...
@@ -341,7 +340,7 @@ static int smctr_alloc_shared_memory(struct net_device *dev)
struct
net_local
*
tp
=
(
struct
net_local
*
)
dev
->
priv
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_alloc_shared_memory
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_alloc_shared_memory
\n
"
,
dev
->
name
);
/* Allocate initial System Control Block pointer.
* This pointer is located in the last page, last offset - 4.
...
...
@@ -456,10 +455,9 @@ static int smctr_bypass_state(struct net_device *dev)
int
err
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_bypass_state
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_bypass_state
\n
"
,
dev
->
name
);
err
=
smctr_setup_single_cmd
(
dev
,
ACB_CMD_CHANGE_JOIN_STATE
,
JS_BYPASS_STATE
);
err
=
smctr_setup_single_cmd
(
dev
,
ACB_CMD_CHANGE_JOIN_STATE
,
JS_BYPASS_STATE
);
return
(
err
);
}
...
...
@@ -470,7 +468,7 @@ static int smctr_checksum_firmware(struct net_device *dev)
__u16
i
,
checksum
=
0
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_checksum_firmware
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_checksum_firmware
\n
"
,
dev
->
name
);
smctr_enable_adapter_ctrl_store
(
dev
);
...
...
@@ -656,7 +654,7 @@ static int smctr_chg_rx_mask(struct net_device *dev)
int
err
=
0
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_chg_rx_mask
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_chg_rx_mask
\n
"
,
dev
->
name
);
smctr_enable_16bit
(
dev
);
smctr_set_page
(
dev
,
(
__u8
*
)
tp
->
ram_access
);
...
...
@@ -787,7 +785,7 @@ static int smctr_decode_firmware(struct net_device *dev)
__u16
*
mem
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_decode_firmware
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_decode_firmware
\n
"
,
dev
->
name
);
weight
=
*
(
long
*
)(
tp
->
ptr_ucode
+
WEIGHT_OFFSET
);
tsize
=
*
(
__u8
*
)(
tp
->
ptr_ucode
+
TREE_SIZE_OFFSET
);
...
...
@@ -852,7 +850,7 @@ static int smctr_disable_adapter_ctrl_store(struct net_device *dev)
int
ioaddr
=
dev
->
base_addr
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_disable_adapter_ctrl_store
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_disable_adapter_ctrl_store
\n
"
,
dev
->
name
);
tp
->
trc_mask
|=
CSR_WCSS
;
outb
(
tp
->
trc_mask
,
ioaddr
+
CSR
);
...
...
@@ -898,7 +896,7 @@ static int smctr_enable_adapter_ctrl_store(struct net_device *dev)
int
ioaddr
=
dev
->
base_addr
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_enable_adapter_ctrl_store
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_enable_adapter_ctrl_store
\n
"
,
dev
->
name
);
smctr_set_trc_reset
(
ioaddr
);
smctr_enable_adapter_ram
(
dev
);
...
...
@@ -915,7 +913,7 @@ static int smctr_enable_adapter_ram(struct net_device *dev)
__u8
r
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_enable_adapter_ram
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_enable_adapter_ram
\n
"
,
dev
->
name
);
r
=
inb
(
ioaddr
+
MSR
);
outb
(
MSR_MEMB
|
r
,
ioaddr
+
MSR
);
...
...
@@ -958,7 +956,7 @@ static int __init smctr_chk_isa(struct net_device *dev)
int
i
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_chk_isa %#4x
\n
"
,
dev
->
name
,
ioaddr
);
printk
(
KERN_DEBUG
"%s: smctr_chk_isa %#4x
\n
"
,
dev
->
name
,
ioaddr
);
if
((
ioaddr
&
0x1F
)
!=
0
)
return
(
-
ENODEV
);
...
...
@@ -979,7 +977,7 @@ static int __init smctr_chk_isa(struct net_device *dev)
b
=
inb
(
ioaddr
+
BDID
);
if
(
b
!=
BRD_ID_8115T
)
{
printk
(
"%s: The adapter found is not supported
\n
"
,
dev
->
name
);
printk
(
KERN_ERR
"%s: The adapter found is not supported
\n
"
,
dev
->
name
);
return
(
-
1
);
}
...
...
@@ -1079,7 +1077,7 @@ static int __init smctr_chk_isa(struct net_device *dev)
break
;
default:
printk
(
"%s: No IRQ found aborting
\n
"
,
dev
->
name
);
printk
(
KERN_ERR
"%s: No IRQ found aborting
\n
"
,
dev
->
name
);
return
(
-
1
);
}
...
...
@@ -1159,7 +1157,7 @@ static int __init smctr_chk_isa(struct net_device *dev)
/* see if the chip is corrupted
if(smctr_read_584_chksum(ioaddr))
{
printk("%s: EEPROM Checksum Failure\n", dev->name);
printk(
KERN_ERR
"%s: EEPROM Checksum Failure\n", dev->name);
return(-1);
}
*/
...
...
@@ -1412,7 +1410,7 @@ static FCBlock *smctr_get_tx_fcb(struct net_device *dev, __u16 queue,
unsigned
short
*
temp
;
if
(
smctr_debug
>
20
)
printk
(
"smctr_get_tx_fcb
\n
"
);
printk
(
KERN_DEBUG
"smctr_get_tx_fcb
\n
"
);
/* check if there is enough FCB blocks */
if
(
tp
->
num_tx_fcbs_used
[
queue
]
>=
tp
->
num_tx_fcbs
[
queue
])
...
...
@@ -1481,7 +1479,7 @@ static int smctr_hardware_send_packet(struct net_device *dev,
FCBlock
*
fcb
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_hardware_send_packet
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_hardware_send_packet
\n
"
,
dev
->
name
);
if
(
tp
->
status
!=
OPEN
)
return
(
-
1
);
...
...
@@ -1533,7 +1531,7 @@ static int smctr_init_acbs(struct net_device *dev)
ACBlock
*
acb
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_init_acbs
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_init_acbs
\n
"
,
dev
->
name
);
acb
=
tp
->
acb_head
;
acb
->
cmd_done_status
=
(
ACB_COMMAND_DONE
|
ACB_COMMAND_SUCCESSFUL
);
...
...
@@ -1576,7 +1574,7 @@ static int smctr_init_adapter(struct net_device *dev)
int
err
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_init_adapter
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_init_adapter
\n
"
,
dev
->
name
);
tp
->
status
=
CLOSED
;
tp
->
page_offset_mask
=
(
tp
->
ram_usable
*
1024
)
-
1
;
...
...
@@ -1605,12 +1603,12 @@ static int smctr_init_adapter(struct net_device *dev)
if
(
smctr_checksum_firmware
(
dev
))
{
printk
(
"%s: Previously loaded firmware is missing
\n
"
,
dev
->
name
);
return
(
-
ENOENT
);
printk
(
KERN_ERR
"%s: Previously loaded firmware is missing
\n
"
,
dev
->
name
);
return
(
-
ENOENT
);
}
if
((
err
=
smctr_ram_memory_test
(
dev
)))
{
printk
(
"%s: RAM memory test failed.
\n
"
,
dev
->
name
);
printk
(
KERN_ERR
"%s: RAM memory test failed.
\n
"
,
dev
->
name
);
return
(
-
EIO
);
}
...
...
@@ -1621,7 +1619,7 @@ static int smctr_init_adapter(struct net_device *dev)
smctr_reset_adapter
(
dev
);
if
((
err
=
smctr_init_card_real
(
dev
)))
{
printk
(
"%s: Initialization of card failed (%d)
\n
"
,
printk
(
KERN_ERR
"%s: Initialization of card failed (%d)
\n
"
,
dev
->
name
,
err
);
return
(
-
EINVAL
);
}
...
...
@@ -1629,7 +1627,7 @@ static int smctr_init_adapter(struct net_device *dev)
/* This routine clobbers the TRC's internal registers. */
if
((
err
=
smctr_internal_self_test
(
dev
)))
{
printk
(
"%s: Card failed internal self test (%d)
\n
"
,
printk
(
KERN_ERR
"%s: Card failed internal self test (%d)
\n
"
,
dev
->
name
,
err
);
return
(
-
EINVAL
);
}
...
...
@@ -1638,7 +1636,7 @@ static int smctr_init_adapter(struct net_device *dev)
smctr_reset_adapter
(
dev
);
if
((
err
=
smctr_init_card_real
(
dev
)))
{
printk
(
"%s: Initialization of card failed (%d)
\n
"
,
printk
(
KERN_ERR
"%s: Initialization of card failed (%d)
\n
"
,
dev
->
name
,
err
);
return
(
-
EINVAL
);
}
...
...
@@ -1657,7 +1655,7 @@ static int smctr_init_adapter(struct net_device *dev)
static
int
__init
smctr_init_card
(
struct
net_device
*
dev
)
{
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_init_card
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_init_card
\n
"
,
dev
->
name
);
return
(
0
);
}
...
...
@@ -1668,7 +1666,7 @@ static int smctr_init_card_real(struct net_device *dev)
int
err
=
0
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_init_card_real
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_init_card_real
\n
"
,
dev
->
name
);
tp
->
sh_mem_used
=
0
;
tp
->
num_acbs
=
NUM_OF_ACBS
;
...
...
@@ -1731,7 +1729,7 @@ static int smctr_init_card_real(struct net_device *dev)
if
((
err
=
smctr_issue_init_txrx_cmd
(
dev
)))
{
printk
(
"%s: Hardware failure
\n
"
,
dev
->
name
);
printk
(
KERN_ERR
"%s: Hardware failure
\n
"
,
dev
->
name
);
return
(
err
);
}
...
...
@@ -1746,7 +1744,7 @@ static int smctr_init_rx_bdbs(struct net_device *dev)
__u16
*
buf
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_init_rx_bdbs
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_init_rx_bdbs
\n
"
,
dev
->
name
);
for
(
i
=
0
;
i
<
NUM_RX_QS_USED
;
i
++
)
{
...
...
@@ -1847,7 +1845,7 @@ static int smctr_init_shared_memory(struct net_device *dev)
__u32
*
iscpb
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_init_shared_memory
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_init_shared_memory
\n
"
,
dev
->
name
);
smctr_set_page
(
dev
,
(
__u8
*
)(
unsigned
int
)
tp
->
iscpb_ptr
);
...
...
@@ -2017,16 +2015,19 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if
(
dev
==
NULL
)
{
printk
(
"%s: irq %d for unknown device.
\n
"
,
dev
->
name
,
irq
);
printk
(
KERN_CRIT
"%s: irq %d for unknown device.
\n
"
,
dev
->
name
,
irq
);
return
;
}
ioaddr
=
dev
->
base_addr
;
tp
=
(
struct
net_local
*
)
dev
->
priv
;
if
(
tp
->
status
==
NOT_INITIALIZED
)
return
;
spin_lock
(
&
tp
->
lock
);
smctr_disable_bic_int
(
dev
);
smctr_enable_16bit
(
dev
);
...
...
@@ -2046,6 +2047,7 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if
(
isb_type
>=
0x10
)
{
smctr_disable_16bit
(
dev
);
spin_unlock
(
&
tp
->
lock
);
return
;
}
...
...
@@ -2063,56 +2065,45 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
switch
(
isb_subtype
)
{
case
0
:
tp
->
monitor_state
=
MS_MONITOR_FSM_INACTIVE
;
tp
->
monitor_state
=
MS_MONITOR_FSM_INACTIVE
;
break
;
case
1
:
tp
->
monitor_state
=
MS_REPEAT_BEACON_STATE
;
tp
->
monitor_state
=
MS_REPEAT_BEACON_STATE
;
break
;
case
2
:
tp
->
monitor_state
=
MS_REPEAT_CLAIM_TOKEN_STATE
;
tp
->
monitor_state
=
MS_REPEAT_CLAIM_TOKEN_STATE
;
break
;
case
3
:
tp
->
monitor_state
=
MS_TRANSMIT_CLAIM_TOKEN_STATE
;
break
;
tp
->
monitor_state
=
MS_TRANSMIT_CLAIM_TOKEN_STATE
;
break
;
case
4
:
tp
->
monitor_state
=
MS_STANDBY_MONITOR_STATE
;
tp
->
monitor_state
=
MS_STANDBY_MONITOR_STATE
;
break
;
case
5
:
tp
->
monitor_state
=
MS_TRANSMIT_BEACON_STATE
;
tp
->
monitor_state
=
MS_TRANSMIT_BEACON_STATE
;
break
;
case
6
:
tp
->
monitor_state
=
MS_ACTIVE_MONITOR_STATE
;
tp
->
monitor_state
=
MS_ACTIVE_MONITOR_STATE
;
break
;
case
7
:
tp
->
monitor_state
=
MS_TRANSMIT_RING_PURGE_STATE
;
tp
->
monitor_state
=
MS_TRANSMIT_RING_PURGE_STATE
;
break
;
case
8
:
/* diagnostic state */
break
;
case
9
:
tp
->
monitor_state
=
MS_BEACON_TEST_STATE
;
tp
->
monitor_state
=
MS_BEACON_TEST_STATE
;
if
(
smctr_lobe_media_test
(
dev
))
{
tp
->
ring_status_flags
=
RING_STATUS_CHANGED
;
tp
->
ring_status
=
AUTO_REMOVAL_ERROR
;
tp
->
ring_status_flags
=
RING_STATUS_CHANGED
;
tp
->
ring_status
=
AUTO_REMOVAL_ERROR
;
smctr_ring_status_chg
(
dev
);
smctr_bypass_state
(
dev
);
}
...
...
@@ -2162,16 +2153,14 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
/* BUG QUEUE for TRC stuck receive BUG */
if
(
isb_subtype
&
TX_PENDING_PRIORITY_2
)
{
if
((
err
=
smctr_tx_complete
(
dev
,
BUG_QUEUE
))
!=
SUCCESS
)
if
((
err
=
smctr_tx_complete
(
dev
,
BUG_QUEUE
))
!=
SUCCESS
)
break
;
}
/* NON-MAC frames only */
if
(
isb_subtype
&
TX_PENDING_PRIORITY_1
)
{
if
((
err
=
smctr_tx_complete
(
dev
,
NON_MAC_QUEUE
))
!=
SUCCESS
)
if
((
err
=
smctr_tx_complete
(
dev
,
NON_MAC_QUEUE
))
!=
SUCCESS
)
break
;
}
...
...
@@ -2189,40 +2178,31 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
*/
interrupt_unmask_bits
|=
0x800
;
tp
->
tx_queue_status
[
BUG_QUEUE
]
=
NOT_TRANSMITING
;
if
((
err
=
smctr_tx_complete
(
dev
,
BUG_QUEUE
))
!=
SUCCESS
)
tp
->
tx_queue_status
[
BUG_QUEUE
]
=
NOT_TRANSMITING
;
if
((
err
=
smctr_tx_complete
(
dev
,
BUG_QUEUE
))
!=
SUCCESS
)
break
;
if
((
err
=
smctr_restart_tx_chain
(
dev
,
BUG_QUEUE
))
!=
SUCCESS
)
if
((
err
=
smctr_restart_tx_chain
(
dev
,
BUG_QUEUE
))
!=
SUCCESS
)
break
;
}
/* NON-MAC queue only */
if
(
isb_subtype
&
TX_PENDING_PRIORITY_1
)
{
tp
->
tx_queue_status
[
NON_MAC_QUEUE
]
=
NOT_TRANSMITING
;
if
((
err
=
smctr_tx_complete
(
dev
,
NON_MAC_QUEUE
))
!=
SUCCESS
)
tp
->
tx_queue_status
[
NON_MAC_QUEUE
]
=
NOT_TRANSMITING
;
if
((
err
=
smctr_tx_complete
(
dev
,
NON_MAC_QUEUE
))
!=
SUCCESS
)
break
;
if
((
err
=
smctr_restart_tx_chain
(
dev
,
NON_MAC_QUEUE
))
!=
SUCCESS
)
if
((
err
=
smctr_restart_tx_chain
(
dev
,
NON_MAC_QUEUE
))
!=
SUCCESS
)
break
;
}
/* MAC queue only */
if
(
isb_subtype
&
TX_PENDING_PRIORITY_0
)
{
tp
->
tx_queue_status
[
MAC_QUEUE
]
=
NOT_TRANSMITING
;
if
((
err
=
smctr_tx_complete
(
dev
,
MAC_QUEUE
))
!=
SUCCESS
)
tp
->
tx_queue_status
[
MAC_QUEUE
]
=
NOT_TRANSMITING
;
if
((
err
=
smctr_tx_complete
(
dev
,
MAC_QUEUE
))
!=
SUCCESS
)
break
;
err
=
smctr_restart_tx_chain
(
dev
,
MAC_QUEUE
);
err
=
smctr_restart_tx_chain
(
dev
,
MAC_QUEUE
);
}
break
;
...
...
@@ -2328,7 +2308,7 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
* complete posted
*/
interrupt_unmask_bits
&=
(
~
0x800
);
printk
(
"Jay please send bug
\n
"
);
// smctr_send_bug(dev);
printk
(
KERN_CRIT
"Jay please send bug
\n
"
);
// smctr_send_bug(dev);
}
if
(
tp
->
ptr_rx_fifo_overruns
)
...
...
@@ -2346,7 +2326,7 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
err
=
SUCCESS
;
if
(
tp
->
acb_head
->
cmd
==
ACB_CMD_HIC_NOP
)
{
printk
(
"i1
\n
"
);
printk
(
KERN_ERR
"i1
\n
"
);
smctr_disable_16bit
(
dev
);
/* XXXXXXXXXXXXXXXXX */
...
...
@@ -2387,8 +2367,7 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if
(
err
!=
SUCCESS
)
{
tp
->
acb_pending
=
0
;
tp
->
acb_pending
=
0
;
break
;
}
}
...
...
@@ -2397,18 +2376,14 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
if
(
tp
->
ptr_una
)
{
tp
->
ptr_una
[
0
]
=
SWAP_BYTES
(((
SBlock
*
)
tp
->
misc_command_data
)
->
UNA
[
0
]);
tp
->
ptr_una
[
1
]
=
SWAP_BYTES
(((
SBlock
*
)
tp
->
misc_command_data
)
->
UNA
[
1
]);
tp
->
ptr_una
[
2
]
=
SWAP_BYTES
(((
SBlock
*
)
tp
->
misc_command_data
)
->
UNA
[
2
]);
tp
->
ptr_una
[
0
]
=
SWAP_BYTES
(((
SBlock
*
)
tp
->
misc_command_data
)
->
UNA
[
0
]);
tp
->
ptr_una
[
1
]
=
SWAP_BYTES
(((
SBlock
*
)
tp
->
misc_command_data
)
->
UNA
[
1
]);
tp
->
ptr_una
[
2
]
=
SWAP_BYTES
(((
SBlock
*
)
tp
->
misc_command_data
)
->
UNA
[
2
]);
}
}
if
(((
SBlock
*
)
tp
->
misc_command_data
)
->
Status_CHG_Indicate
&
READY_TO_SEND_RQ_INIT
)
{
if
(((
SBlock
*
)
tp
->
misc_command_data
)
->
Status_CHG_Indicate
&
READY_TO_SEND_RQ_INIT
)
{
err
=
smctr_send_rq_init
(
dev
);
}
}
...
...
@@ -2446,45 +2421,37 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
break
;
case
1
:
tp
->
join_state
=
JS_LOBE_TEST_STATE
;
tp
->
join_state
=
JS_LOBE_TEST_STATE
;
break
;
case
2
:
tp
->
join_state
=
JS_DETECT_MONITOR_PRESENT_STATE
;
tp
->
join_state
=
JS_DETECT_MONITOR_PRESENT_STATE
;
break
;
case
3
:
tp
->
join_state
=
JS_AWAIT_NEW_MONITOR_STATE
;
tp
->
join_state
=
JS_AWAIT_NEW_MONITOR_STATE
;
break
;
case
4
:
tp
->
join_state
=
JS_DUPLICATE_ADDRESS_TEST_STATE
;
tp
->
join_state
=
JS_DUPLICATE_ADDRESS_TEST_STATE
;
break
;
case
5
:
tp
->
join_state
=
JS_NEIGHBOR_NOTIFICATION_STATE
;
tp
->
join_state
=
JS_NEIGHBOR_NOTIFICATION_STATE
;
break
;
case
6
:
tp
->
join_state
=
JS_REQUEST_INITIALIZATION_STATE
;
tp
->
join_state
=
JS_REQUEST_INITIALIZATION_STATE
;
break
;
case
7
:
tp
->
join_state
=
JS_JOIN_COMPLETE_STATE
;
tp
->
join_state
=
JS_JOIN_COMPLETE_STATE
;
tp
->
status
=
OPEN
;
err
=
smctr_status_chg
(
dev
);
break
;
case
8
:
tp
->
join_state
=
JS_BYPASS_WAIT_STATE
;
tp
->
join_state
=
JS_BYPASS_WAIT_STATE
;
break
;
}
break
;
...
...
@@ -2514,11 +2481,11 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
* but we still want to issue ack to ISB
*/
if
(
!
(
interrupt_ack_code
&
0xff00
))
smctr_issue_int_ack
(
dev
,
interrupt_ack_code
,
interrupt_unmask_bits
);
smctr_issue_int_ack
(
dev
,
interrupt_ack_code
,
interrupt_unmask_bits
);
smctr_disable_16bit
(
dev
);
smctr_enable_bic_int
(
dev
);
spin_unlock
(
&
tp
->
lock
);
return
;
}
...
...
@@ -2533,16 +2500,14 @@ static int smctr_issue_enable_int_cmd(struct net_device *dev,
return
(
err
);
tp
->
sclb_ptr
->
int_mask_control
=
interrupt_enable_mask
;
tp
->
sclb_ptr
->
valid_command
=
SCLB_VALID
|
SCLB_CMD_CLEAR_INTERRUPT_MASK
;
tp
->
sclb_ptr
->
valid_command
=
SCLB_VALID
|
SCLB_CMD_CLEAR_INTERRUPT_MASK
;
smctr_set_ctrl_attention
(
dev
);
return
(
0
);
}
static
int
smctr_issue_int_ack
(
struct
net_device
*
dev
,
__u16
iack_code
,
__u16
ibits
)
static
int
smctr_issue_int_ack
(
struct
net_device
*
dev
,
__u16
iack_code
,
__u16
ibits
)
{
struct
net_local
*
tp
=
(
struct
net_local
*
)
dev
->
priv
;
...
...
@@ -2551,9 +2516,7 @@ static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code,
tp
->
sclb_ptr
->
int_mask_control
=
ibits
;
tp
->
sclb_ptr
->
iack_code
=
iack_code
<<
1
;
/* use the offset from base */
tp
->
sclb_ptr
->
resume_control
=
0
;
tp
->
sclb_ptr
->
valid_command
=
SCLB_VALID
|
SCLB_IACK_CODE_VALID
|
SCLB_CMD_CLEAR_INTERRUPT_MASK
;
tp
->
sclb_ptr
->
valid_command
=
SCLB_VALID
|
SCLB_IACK_CODE_VALID
|
SCLB_CMD_CLEAR_INTERRUPT_MASK
;
smctr_set_ctrl_attention
(
dev
);
...
...
@@ -2729,7 +2692,7 @@ static int smctr_issue_init_txrx_cmd(struct net_device *dev)
if
((
err
=
smctr_wait_cmd
(
dev
)))
{
printk
(
"%s: Hardware failure
\n
"
,
dev
->
name
);
printk
(
KERN_ERR
"%s: Hardware failure
\n
"
,
dev
->
name
);
return
(
err
);
}
...
...
@@ -2864,7 +2827,7 @@ static int smctr_issue_resume_rx_fcb_cmd(struct net_device *dev, __u16 queue)
struct
net_local
*
tp
=
(
struct
net_local
*
)
dev
->
priv
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_issue_resume_rx_fcb_cmd
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_issue_resume_rx_fcb_cmd
\n
"
,
dev
->
name
);
if
(
smctr_wait_while_cbusy
(
dev
))
return
(
-
1
);
...
...
@@ -2886,7 +2849,7 @@ static int smctr_issue_resume_tx_fcb_cmd(struct net_device *dev, __u16 queue)
struct
net_local
*
tp
=
(
struct
net_local
*
)
dev
->
priv
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_issue_resume_tx_fcb_cmd
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_issue_resume_tx_fcb_cmd
\n
"
,
dev
->
name
);
if
(
smctr_wait_while_cbusy
(
dev
))
return
(
-
1
);
...
...
@@ -3035,7 +2998,7 @@ static int smctr_load_firmware(struct net_device *dev)
int
err
=
0
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_load_firmware
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_load_firmware
\n
"
,
dev
->
name
);
tp
->
ptr_ucode
=
smctr_code
;
tp
->
num_of_tx_buffs
=
4
;
...
...
@@ -3151,7 +3114,7 @@ static int smctr_lobe_media_test(struct net_device *dev)
unsigned
short
saved_rcv_mask
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_lobe_media_test
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_lobe_media_test
\n
"
,
dev
->
name
);
/* Clear receive mask for lobe test. */
saved_rcv_mask
=
tp
->
receive_mask
;
...
...
@@ -3225,7 +3188,7 @@ static int smctr_lobe_media_test_cmd(struct net_device *dev)
int
err
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_lobe_media_test_cmd
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_lobe_media_test_cmd
\n
"
,
dev
->
name
);
/* Change to lobe media test state. */
if
(
tp
->
monitor_state
!=
MS_BEACON_TEST_STATE
)
...
...
@@ -3233,7 +3196,7 @@ static int smctr_lobe_media_test_cmd(struct net_device *dev)
smctr_lobe_media_test_state
(
dev
);
if
(
smctr_wait_cmd
(
dev
))
{
printk
(
"Lobe Failed test state
\n
"
);
printk
(
KERN_ERR
"Lobe Failed test state
\n
"
);
return
(
LOBE_MEDIA_TEST_FAILED
);
}
}
...
...
@@ -3548,7 +3511,7 @@ static int smctr_open(struct net_device *dev)
int
err
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_open
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_open
\n
"
,
dev
->
name
);
err
=
smctr_init_adapter
(
dev
);
if
(
err
<
0
)
...
...
@@ -3569,7 +3532,7 @@ static int smctr_open_tr(struct net_device *dev)
int
err
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_open_tr
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_open_tr
\n
"
,
dev
->
name
);
/* Now we can actually open the adapter. */
if
(
tp
->
status
==
OPEN
)
...
...
@@ -3577,8 +3540,9 @@ static int smctr_open_tr(struct net_device *dev)
if
(
tp
->
status
!=
INITIALIZED
)
return
(
-
1
);
save_flags
(
flags
);
cli
();
/* FIXME: it would work a lot better if we masked the irq sources
on the card here, then we could skip the locking and poll nicely */
spin_lock_irqsave
(
&
tp
->
lock
,
flags
);
smctr_set_page
(
dev
,
(
__u8
*
)
tp
->
ram_access
);
...
...
@@ -3642,14 +3606,14 @@ static int smctr_open_tr(struct net_device *dev)
else
{
if
(
err
==
LOBE_MEDIA_TEST_FAILED
)
printk
(
"%s: Lobe Media Test Failure - Check cable?
\n
"
,
dev
->
name
);
printk
(
KERN_WARNING
"%s: Lobe Media Test Failure - Check cable?
\n
"
,
dev
->
name
);
}
}
}
}
out:
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
tp
->
lock
,
flags
);
return
(
err
);
}
...
...
@@ -3704,6 +3668,8 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr)
goto
out
;
}
memset
(
tp
,
0
,
sizeof
(
struct
net_local
));
spin_lock_init
(
&
tp
->
lock
);
dev
->
priv
=
tp
;
dev
->
base_addr
=
ioaddr
;
...
...
@@ -3727,7 +3693,7 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr)
err
=
smctr_load_firmware
(
dev
);
if
(
err
!=
UCODE_PRESENT
&&
err
!=
SUCCESS
)
{
printk
(
"%s: Firmware load failed (%d)
\n
"
,
dev
->
name
,
err
);
printk
(
KERN_ERR
"%s: Firmware load failed (%d)
\n
"
,
dev
->
name
,
err
);
err
=
-
EIO
;
goto
out_tp
;
}
...
...
@@ -3738,7 +3704,7 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr)
else
tp
->
media_type
=
MEDIA_UTP_16
;
printk
(
"%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.
\n
"
,
printk
(
KERN_INFO
"%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.
\n
"
,
dev
->
name
,
smctr_name
,
smctr_model
,
(
unsigned
int
)
dev
->
base_addr
,
dev
->
irq
,
tp
->
rom_base
,
tp
->
ram_base
);
...
...
@@ -3777,8 +3743,7 @@ static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size,
{
/* Received MAC Frames Processed by RS. */
case
INIT
:
if
((
rcode
=
smctr_rcv_init
(
dev
,
rmf
,
&
correlator
))
==
HARDWARE_FAILED
)
if
((
rcode
=
smctr_rcv_init
(
dev
,
rmf
,
&
correlator
))
==
HARDWARE_FAILED
)
{
return
(
rcode
);
}
...
...
@@ -3993,7 +3958,7 @@ static int smctr_ram_memory_test(struct net_device *dev)
__u8
err
=
0
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_ram_memory_test
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_ram_memory_test
\n
"
,
dev
->
name
);
start_pattern
=
0x0001
;
pages_of_ram
=
tp
->
ram_size
/
tp
->
ram_usable
;
...
...
@@ -4401,7 +4366,7 @@ static int smctr_restart_tx_chain(struct net_device *dev, short queue)
int
err
=
0
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_restart_tx_chain
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_restart_tx_chain
\n
"
,
dev
->
name
);
if
(
tp
->
num_tx_fcbs_used
[
queue
]
!=
0
&&
tp
->
tx_queue_status
[
queue
]
==
NOT_TRANSMITING
)
...
...
@@ -4418,7 +4383,7 @@ static int smctr_ring_status_chg(struct net_device *dev)
struct
net_local
*
tp
=
(
struct
net_local
*
)
dev
->
priv
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_ring_status_chg
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_ring_status_chg
\n
"
,
dev
->
name
);
/* Check for ring_status_flag: whenever MONITOR_STATE_BIT
* Bit is set, check value of monitor_state, only then we
...
...
@@ -4502,7 +4467,7 @@ static int smctr_ring_status_chg(struct net_device *dev)
break
;
case
SIGNAL_LOSS
:
printk
(
KERN_INFO
"%s: Si
ng
al Loss
\n
"
,
dev
->
name
);
printk
(
KERN_INFO
"%s: Si
gn
al Loss
\n
"
,
dev
->
name
);
tp
->
current_ring_status
|=
SIGNAL_LOSS
;
break
;
...
...
@@ -4522,9 +4487,8 @@ static int smctr_rx_frame(struct net_device *dev)
__u8
*
pbuff
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_rx_frame
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_rx_frame
\n
"
,
dev
->
name
);
cli
();
queue
=
tp
->
receive_queue_number
;
while
((
status
=
tp
->
rx_fcb_curr
[
queue
]
->
frame_status
)
!=
SUCCESS
)
...
...
@@ -4554,7 +4518,6 @@ static int smctr_rx_frame(struct net_device *dev)
skb_put
(
skb
,
rx_size
);
memcpy
(
skb
->
data
,
pbuff
,
rx_size
);
sti
();
/* Update Counters */
tp
->
MacStat
.
rx_packets
++
;
...
...
@@ -4566,7 +4529,6 @@ static int smctr_rx_frame(struct net_device *dev)
netif_rx
(
skb
);
dev
->
last_rx
=
jiffies
;
}
else
{
sti
();
}
}
else
...
...
@@ -4593,7 +4555,7 @@ static int smctr_send_dat(struct net_device *dev)
FCBlock
*
fcb
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_send_dat
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_send_dat
\n
"
,
dev
->
name
);
if
((
fcb
=
smctr_get_tx_fcb
(
dev
,
MAC_QUEUE
,
sizeof
(
MAC_HEADER
)))
==
(
FCBlock
*
)(
-
1L
))
...
...
@@ -4670,7 +4632,7 @@ static int smctr_send_packet(struct sk_buff *skb, struct net_device *dev)
struct
net_local
*
tp
=
(
struct
net_local
*
)
dev
->
priv
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_send_packet
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_send_packet
\n
"
,
dev
->
name
);
/*
* Block a transmit overlap
...
...
@@ -4700,7 +4662,7 @@ static int smctr_send_lobe_media_test(struct net_device *dev)
int
err
;
if
(
smctr_debug
>
15
)
printk
(
"%s: smctr_send_lobe_media_test
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_send_lobe_media_test
\n
"
,
dev
->
name
);
if
((
fcb
=
smctr_get_tx_fcb
(
dev
,
MAC_QUEUE
,
sizeof
(
struct
trh_hdr
)
+
S_WRAP_DATA
+
S_WRAP_DATA
))
==
(
FCBlock
*
)(
-
1L
))
...
...
@@ -5241,7 +5203,7 @@ static unsigned short smctr_set_ctrl_attention(struct net_device *dev)
static
void
smctr_set_multicast_list
(
struct
net_device
*
dev
)
{
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_set_multicast_list
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_set_multicast_list
\n
"
,
dev
->
name
);
return
;
}
...
...
@@ -5310,7 +5272,7 @@ static int smctr_set_rx_look_ahead(struct net_device *dev)
__u16
sword
,
rword
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_set_rx_look_ahead_flag
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_set_rx_look_ahead_flag
\n
"
,
dev
->
name
);
tp
->
adapter_flags
&=
~
(
FORCED_16BIT_MODE
);
tp
->
adapter_flags
|=
RX_VALID_LOOKAHEAD
;
...
...
@@ -5353,7 +5315,7 @@ static int smctr_setup_single_cmd(struct net_device *dev,
unsigned
int
err
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_setup_single_cmd
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_setup_single_cmd
\n
"
,
dev
->
name
);
if
((
err
=
smctr_wait_while_cbusy
(
dev
)))
return
(
err
);
...
...
@@ -5403,7 +5365,7 @@ static int smctr_status_chg(struct net_device *dev)
struct
net_local
*
tp
=
(
struct
net_local
*
)
dev
->
priv
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_status_chg
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_status_chg
\n
"
,
dev
->
name
);
switch
(
tp
->
status
)
{
...
...
@@ -5440,7 +5402,7 @@ static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb,
int
err
=
0
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_trc_send_packet
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_trc_send_packet
\n
"
,
dev
->
name
);
fcb
->
info
=
FCB_CHAIN_END
|
FCB_ENABLE_TFS
;
if
(
tp
->
num_tx_fcbs
[
queue
]
!=
1
)
...
...
@@ -5462,7 +5424,7 @@ static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue)
int
cstatus
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_tx_complete
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_tx_complete
\n
"
,
dev
->
name
);
while
((
status
=
tp
->
tx_fcb_end
[
queue
]
->
frame_status
)
!=
SUCCESS
)
{
...
...
@@ -5518,7 +5480,7 @@ static unsigned short smctr_tx_move_frame(struct net_device *dev,
__u8
*
frag
,
*
page
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_tx_move_frame
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_tx_move_frame
\n
"
,
dev
->
name
);
ram_usable
=
((
unsigned
int
)
tp
->
ram_usable
)
<<
10
;
frag
=
skb
->
data
;
...
...
@@ -5636,7 +5598,7 @@ static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb,
struct
net_local
*
tp
=
(
struct
net_local
*
)
dev
->
priv
;
if
(
smctr_debug
>
20
)
printk
(
"smctr_update_tx_chain
\n
"
);
printk
(
KERN_DEBUG
"smctr_update_tx_chain
\n
"
);
if
(
tp
->
num_tx_fcbs_used
[
queue
]
<=
0
)
return
(
HARDWARE_FAILED
);
...
...
@@ -5673,7 +5635,7 @@ static int smctr_wait_cmd(struct net_device *dev)
unsigned
int
loop_count
=
0x20000
;
if
(
smctr_debug
>
10
)
printk
(
"%s: smctr_wait_cmd
\n
"
,
dev
->
name
);
printk
(
KERN_DEBUG
"%s: smctr_wait_cmd
\n
"
,
dev
->
name
);
while
(
loop_count
)
{
...
...
@@ -5764,7 +5726,7 @@ int init_module(void)
dev_smctr
[
i
]
=
NULL
;
if
(
i
==
0
)
{
printk
(
"%s: register_trdev() returned (<0).
\n
"
,
printk
(
KERN_ERR
"%s: register_trdev() returned (<0).
\n
"
,
cardname
);
return
(
-
EIO
);
}
...
...
drivers/net/tokenring/smctr.h
View file @
ee29d109
...
...
@@ -1050,6 +1050,8 @@ typedef struct net_local {
__u16
QueueSkb
;
struct
tr_statistics
MacStat
;
/* MAC statistics structure */
spinlock_t
lock
;
}
NET_LOCAL
;
/************************************
...
...
drivers/scsi/fd_mcs.c
View file @
ee29d109
...
...
@@ -253,7 +253,7 @@ struct fd_hostdata {
#define INTR_Processed (HOSTDATA(shpnt)->_INTR_Processed)
struct
fd_mcs_adapters_struct
{
char
*
name
;
char
*
name
;
int
id
;
enum
chip_type
fd_chip
;
int
fifo_size
;
...
...
@@ -263,89 +263,84 @@ struct fd_mcs_adapters_struct {
#define REPLY_ID 0x5137
static
struct
fd_mcs_adapters_struct
fd_mcs_adapters
[]
=
{
{
"Future Domain SCSI Adapter MCS-700(18C50)"
,
{
"Future Domain SCSI Adapter MCS-700(18C50)"
,
0x60e9
,
tmc18c50
,
0x2000
,
4
},
{
"Future Domain SCSI Adapter MCS-600/700(TMC-1800)"
,
4
},
{
"Future Domain SCSI Adapter MCS-600/700(TMC-1800)"
,
0x6127
,
tmc1800
,
0x2000
,
4
},
{
"Reply Sound Blaster/SCSI Adapter"
,
4
},
{
"Reply Sound Blaster/SCSI Adapter"
,
REPLY_ID
,
tmc18c30
,
0x800
,
2
},
2
},
};
#define FD_BRDS sizeof(fd_mcs_adapters)/sizeof(struct fd_mcs_adapters_struct)
static
void
fd_mcs_intr
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
);
static
void
fd_mcs_intr
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
);
static
unsigned
long
addresses
[]
=
{
0xc8000
,
0xca000
,
0xce000
,
0xde000
};
static
unsigned
long
addresses
[]
=
{
0xc8000
,
0xca000
,
0xce000
,
0xde000
};
static
unsigned
short
ports
[]
=
{
0x140
,
0x150
,
0x160
,
0x170
};
static
unsigned
short
ints
[]
=
{
3
,
5
,
10
,
11
,
12
,
14
,
15
,
0
};
/* host information */
static
int
found
=
0
;
static
struct
Scsi_Host
*
hosts
[
FD_MAX_HOSTS
+
1
]
=
{
NULL
};
static
struct
Scsi_Host
*
hosts
[
FD_MAX_HOSTS
+
1
]
=
{
NULL
};
static
int
user_fifo_count
=
0
;
static
int
user_fifo_size
=
0
;
void
fd_mcs_setup
(
char
*
str
,
int
*
ints
)
static
void
fd_mcs_setup
(
char
*
str
,
int
*
ints
)
{
static
int
done_setup
=
0
;
if
(
done_setup
++
||
ints
[
0
]
<
1
||
ints
[
0
]
>
2
||
ints
[
1
]
<
1
||
ints
[
1
]
>
16
)
{
printk
(
"fd_mcs: usage: fd_mcs=FIFO_COUNT, FIFO_SIZE
\n
"
);
if
(
done_setup
++
||
ints
[
0
]
<
1
||
ints
[
0
]
>
2
||
ints
[
1
]
<
1
||
ints
[
1
]
>
16
)
{
printk
(
"fd_mcs: usage: fd_mcs=FIFO_COUNT, FIFO_SIZE
\n
"
);
}
user_fifo_count
=
ints
[
0
]
>=
1
?
ints
[
1
]
:
0
;
user_fifo_size
=
ints
[
0
]
>=
2
?
ints
[
2
]
:
0
;
}
static
void
print_banner
(
struct
Scsi_Host
*
shpnt
)
__setup
(
"fd_mcs="
,
fd_mcs_setup
);
static
void
print_banner
(
struct
Scsi_Host
*
shpnt
)
{
printk
(
"scsi%d <fd_mcs>: "
,
shpnt
->
host_no
);
printk
(
"scsi%d <fd_mcs>: "
,
shpnt
->
host_no
);
if
(
bios_base
)
{
printk
(
"BIOS at 0x%lX"
,
bios_base
);
printk
(
"BIOS at 0x%lX"
,
bios_base
);
}
else
{
printk
(
"No BIOS"
);
printk
(
"No BIOS"
);
}
printk
(
", HostID %d, %s Chip, IRQ %d, IO 0x%lX
\n
"
,
shpnt
->
this_id
,
chip
==
tmc18c50
?
"TMC-18C50"
:
(
chip
==
tmc18c30
?
"TMC-18C30"
:
(
chip
==
tmc1800
?
"TMC-1800"
:
"Unknown"
)),
shpnt
->
irq
,
shpnt
->
io_port
);
printk
(
", HostID %d, %s Chip, IRQ %d, IO 0x%lX
\n
"
,
shpnt
->
this_id
,
chip
==
tmc18c50
?
"TMC-18C50"
:
(
chip
==
tmc18c30
?
"TMC-18C30"
:
(
chip
==
tmc1800
?
"TMC-1800"
:
"Unknown"
)),
shpnt
->
irq
,
shpnt
->
io_port
);
}
static
void
do_pause
(
unsigned
amount
)
/* Pause for amount*10 milliseconds */
{
static
void
do_pause
(
unsigned
amount
)
{
/* Pause for amount*10 milliseconds */
do
{
udelay
(
10
*
100
0
);
mdelay
(
1
0
);
}
while
(
--
amount
);
}
inline
static
void
fd_mcs_make_bus_idle
(
struct
Scsi_Host
*
shpnt
)
static
void
fd_mcs_make_bus_idle
(
struct
Scsi_Host
*
shpnt
)
{
outb
(
0
,
SCSI_Cntl_port
);
outb
(
0
,
SCSI_Mode_Cntl_port
);
outb
(
0
,
SCSI_Cntl_port
);
outb
(
0
,
SCSI_Mode_Cntl_port
);
if
(
chip
==
tmc18c50
||
chip
==
tmc18c30
)
outb
(
0x21
|
PARITY_MASK
,
TMC_Cntl_port
);
/* Clear forced intr. */
outb
(
0x21
|
PARITY_MASK
,
TMC_Cntl_port
);
/* Clear forced intr. */
else
outb
(
0x01
|
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
0x01
|
PARITY_MASK
,
TMC_Cntl_port
);
}
int
fd_mcs_detect
(
Scsi_Host_Template
*
tpnt
)
static
int
fd_mcs_detect
(
Scsi_Host_Template
*
tpnt
)
{
int
loop
;
struct
Scsi_Host
*
shpnt
;
...
...
@@ -363,27 +358,24 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
/* changeable? */
id
=
7
;
for
(
loop
=
0
;
loop
<
FD_BRDS
;
loop
++
)
{
for
(
loop
=
0
;
loop
<
FD_BRDS
;
loop
++
)
{
slot
=
0
;
while
(
MCA_NOTFOUND
!=
(
slot
=
mca_find_adapter
(
fd_mcs_adapters
[
loop
].
id
,
slot
))
)
{
while
(
MCA_NOTFOUND
!=
(
slot
=
mca_find_adapter
(
fd_mcs_adapters
[
loop
].
id
,
slot
)))
{
/* if we get this far, an adapter has been detected and is
enabled */
printk
(
"scsi <fd_mcs>: %s at slot %d
\n
"
,
fd_mcs_adapters
[
loop
].
name
,
slot
+
1
);
printk
(
KERN_INFO
"scsi <fd_mcs>: %s at slot %d
\n
"
,
fd_mcs_adapters
[
loop
].
name
,
slot
+
1
);
pos2
=
mca_read_stored_pos
(
slot
,
2
);
pos3
=
mca_read_stored_pos
(
slot
,
3
);
pos4
=
mca_read_stored_pos
(
slot
,
4
);
pos2
=
mca_read_stored_pos
(
slot
,
2
);
pos3
=
mca_read_stored_pos
(
slot
,
3
);
pos4
=
mca_read_stored_pos
(
slot
,
4
);
/* ready for next probe */
slot
++
;
if
(
fd_mcs_adapters
[
loop
].
id
==
REPLY_ID
)
{
/* reply card */
static
int
reply_irq
[]
=
{
10
,
11
,
14
,
15
};
static
int
reply_irq
[]
=
{
10
,
11
,
14
,
15
};
bios
=
0
;
/* no bios */
...
...
@@ -393,7 +385,7 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
continue
;
/* can't really disable it, same as irq=10 */
irq
=
reply_irq
[((
pos4
>>
2
)
&
0x1
)
+
2
*
((
pos4
>>
4
)
&
0x1
)];
irq
=
reply_irq
[((
pos4
>>
2
)
&
0x1
)
+
2
*
((
pos4
>>
4
)
&
0x1
)];
}
else
{
bios
=
addresses
[
pos2
>>
6
];
port
=
ports
[(
pos2
>>
4
)
&
0x03
];
...
...
@@ -402,25 +394,27 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
if
(
irq
)
{
/* claim the slot */
mca_set_adapter_name
(
slot
-
1
,
fd_mcs_adapters
[
loop
].
name
);
mca_set_adapter_name
(
slot
-
1
,
fd_mcs_adapters
[
loop
].
name
);
/* check irq/region */
if
(
check_region
(
port
,
0x10
)
||
request_irq
(
irq
,
fd_mcs_intr
,
SA_SHIRQ
,
"fd_mcs"
,
hosts
))
{
printk
(
"fd_mcs: check_region() || request_irq() failed, Skip it
\n
"
);
if
(
request_irq
(
irq
,
fd_mcs_intr
,
SA_SHIRQ
,
"fd_mcs"
,
hosts
))
{
printk
(
KERN_ERR
"fd_mcs: interrupt is not available, skipping...
\n
"
);
continue
;
}
/* request I/O region */
if
(
request_region
(
port
,
0x10
,
"fd_mcs"
))
{
printk
(
KERN_ERR
"fd_mcs: I/O region is already in use, skipping...
\n
"
);
continue
;
}
/* register */
if
(
!
(
shpnt
=
scsi_register
(
tpnt
,
sizeof
(
struct
fd_hostdata
))))
{
printk
(
"fd_mcs: scsi_register() failed
\n
"
);
printk
(
KERN_ERR
"fd_mcs: scsi_register() failed
\n
"
);
release_region
(
port
,
0x10
);
free_irq
(
irq
,
hosts
);
continue
;
}
/* request I/O region */
request_region
(
port
,
0x10
,
"fd_mcs"
);
/* save name */
strcpy
(
adapter_name
,
fd_mcs_adapters
[
loop
].
name
);
...
...
@@ -428,10 +422,8 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
/* chip/fifo */
chip
=
fd_mcs_adapters
[
loop
].
fd_chip
;
/* use boot time value if available */
FIFO_COUNT
=
user_fifo_count
?
user_fifo_count
:
fd_mcs_adapters
[
loop
].
fifo_count
;
FIFO_Size
=
user_fifo_size
?
user_fifo_size
:
fd_mcs_adapters
[
loop
].
fifo_size
;
FIFO_COUNT
=
user_fifo_count
?
user_fifo_count
:
fd_mcs_adapters
[
loop
].
fifo_count
;
FIFO_Size
=
user_fifo_size
?
user_fifo_size
:
fd_mcs_adapters
[
loop
].
fifo_size
;
#ifdef NOT_USED
/* *************************************************** */
...
...
@@ -439,15 +431,14 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
works on an 18c30 chip. (User reports
say this works, so we should switch to
it in the near future.) */
outb
(
0x80
,
port
+
IO_Control
);
if
((
inb
(
port
+
Configuration2
)
&
0x80
)
==
0x80
)
{
outb
(
0x00
,
port
+
IO_Control
);
if
((
inb
(
port
+
Configuration2
)
&
0x80
)
==
0x00
)
{
outb
(
0x80
,
port
+
IO_Control
);
if
((
inb
(
port
+
Configuration2
)
&
0x80
)
==
0x80
)
{
outb
(
0x00
,
port
+
IO_Control
);
if
((
inb
(
port
+
Configuration2
)
&
0x80
)
==
0x00
)
{
chip
=
tmc18c30
;
FIFO_Size
=
0x800
;
/* 2k FIFO */
printk
(
"FIRST: chip=%s, fifo_size=0x%x
\n
"
,
(
chip
==
tmc18c30
)
?
"tmc18c30"
:
"tmc18c50"
,
FIFO_Size
);
printk
(
"FIRST: chip=%s, fifo_size=0x%x
\n
"
,
(
chip
==
tmc18c30
)
?
"tmc18c30"
:
"tmc18c50"
,
FIFO_Size
);
}
}
...
...
@@ -455,12 +446,11 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
have problems. Let's assume it is an
18c30 if the RAM is disabled. */
if
(
inb
(
port
+
Configuration2
)
&
0x02
)
{
if
(
inb
(
port
+
Configuration2
)
&
0x02
)
{
chip
=
tmc18c30
;
FIFO_Size
=
0x800
;
/* 2k FIFO */
printk
(
"SECOND: chip=%s, fifo_size=0x%x
\n
"
,
(
chip
==
tmc18c30
)
?
"tmc18c30"
:
"tmc18c50"
,
FIFO_Size
);
printk
(
"SECOND: chip=%s, fifo_size=0x%x
\n
"
,
(
chip
==
tmc18c30
)
?
"tmc18c30"
:
"tmc18c50"
,
FIFO_Size
);
}
/* *************************************************** */
#endif
...
...
@@ -503,15 +493,15 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
INTR_Processed
=
0
;
/* say something */
print_banner
(
shpnt
);
print_banner
(
shpnt
);
/* reset */
outb
(
1
,
SCSI_Cntl_port
);
do_pause
(
2
);
outb
(
0
,
SCSI_Cntl_port
);
do_pause
(
115
);
outb
(
0
,
SCSI_Mode_Cntl_port
);
outb
(
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
1
,
SCSI_Cntl_port
);
do_pause
(
2
);
outb
(
0
,
SCSI_Cntl_port
);
do_pause
(
115
);
outb
(
0
,
SCSI_Mode_Cntl_port
);
outb
(
PARITY_MASK
,
TMC_Cntl_port
);
/* done reset */
#if DO_DETECT
...
...
@@ -522,46 +512,44 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
Scsi_Cmnd
SCinit
;
unsigned
char
do_inquiry
[]
=
{
INQUIRY
,
0
,
0
,
0
,
buflen
,
0
};
unsigned
char
do_request_sense
[]
=
{
REQUEST_SENSE
,
0
,
0
,
0
,
buflen
,
0
};
0
,
0
,
0
,
buflen
,
0
};
unsigned
char
do_read_capacity
[]
=
{
READ_CAPACITY
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
unsigned
char
buf
[
buflen
];
SCinit
.
request_buffer
=
SCinit
.
buffer
=
buf
;
SCinit
.
request_bufflen
=
SCinit
.
bufflen
=
sizeof
(
buf
)
-
1
;
SCinit
.
request_bufflen
=
SCinit
.
bufflen
=
sizeof
(
buf
)
-
1
;
SCinit
.
use_sg
=
0
;
SCinit
.
lun
=
0
;
SCinit
.
host
=
shpnt
;
printk
(
"fd_mcs: detection routine scanning for devices:
\n
"
);
printk
(
"fd_mcs: detection routine scanning for devices:
\n
"
);
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
i
==
shpnt
->
this_id
)
/* Skip host adapter */
continue
;
SCinit
.
target
=
i
;
memcpy
(
SCinit
.
cmnd
,
do_request_sense
,
sizeof
(
do_request_sense
));
memcpy
(
SCinit
.
cmnd
,
do_request_sense
,
sizeof
(
do_request_sense
));
retcode
=
fd_mcs_command
(
&
SCinit
);
if
(
!
retcode
)
{
memcpy
(
SCinit
.
cmnd
,
do_inquiry
,
sizeof
(
do_inquiry
));
retcode
=
fd_mcs_command
(
&
SCinit
);
if
(
!
retcode
)
{
printk
(
" SCSI ID %d: "
,
i
);
printk
(
" SCSI ID %d: "
,
i
);
for
(
j
=
8
;
j
<
(
buf
[
4
]
<
32
?
buf
[
4
]
:
32
);
j
++
)
printk
(
"%c"
,
buf
[
j
]
>=
20
?
buf
[
j
]
:
' '
);
memcpy
(
SCinit
.
cmnd
,
do_read_capacity
,
sizeof
(
do_read_capacity
));
printk
(
"%c"
,
buf
[
j
]
>=
20
?
buf
[
j
]
:
' '
);
memcpy
(
SCinit
.
cmnd
,
do_read_capacity
,
sizeof
(
do_read_capacity
));
retcode
=
fd_mcs_command
(
&
SCinit
);
if
(
!
retcode
)
{
unsigned
long
blocks
,
size
,
capacity
;
blocks
=
(
buf
[
0
]
<<
24
)
|
(
buf
[
1
]
<<
16
)
|
(
buf
[
2
]
<<
8
)
|
buf
[
3
];
size
=
(
buf
[
4
]
<<
24
)
|
(
buf
[
5
]
<<
16
)
|
(
buf
[
6
]
<<
8
)
|
buf
[
7
];
capacity
=
+
(
+
(
blocks
/
1024L
)
*
+
(
size
*
10L
))
/
1024L
;
size
=
(
buf
[
4
]
<<
24
)
|
(
buf
[
5
]
<<
16
)
|
(
buf
[
6
]
<<
8
)
|
buf
[
7
];
capacity
=
+
(
+
(
blocks
/
1024L
)
*
+
(
size
*
10L
))
/
1024L
;
printk
(
"%lu MB (%lu byte blocks)
\n
"
,
((
capacity
+
5L
)
/
10L
),
size
);
printk
(
"%lu MB (%lu byte blocks)
\n
"
,
((
capacity
+
5L
)
/
10L
),
size
);
}
}
}
...
...
@@ -572,8 +560,7 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
}
if
(
found
==
FD_MAX_HOSTS
)
{
printk
(
"fd_mcs: detecting reached max=%d host adapters.
\n
"
,
FD_MAX_HOSTS
);
printk
(
"fd_mcs: detecting reached max=%d host adapters.
\n
"
,
FD_MAX_HOSTS
);
break
;
}
}
...
...
@@ -581,7 +568,7 @@ int fd_mcs_detect( Scsi_Host_Template *tpnt )
return
found
;
}
const
char
*
fd_mcs_info
(
struct
Scsi_Host
*
shpnt
)
static
const
char
*
fd_mcs_info
(
struct
Scsi_Host
*
shpnt
)
{
return
adapter_name
;
}
...
...
@@ -598,15 +585,14 @@ static int TOTAL_INTR = 0;
* length: If inout==FALSE max number of bytes to be written into the buffer
* else number of bytes in the buffer
*/
int
fd_mcs_proc_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
,
int
hostno
,
int
inout
)
static
int
fd_mcs_proc_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
,
int
hostno
,
int
inout
)
{
struct
Scsi_Host
*
shpnt
;
int
len
=
0
;
int
i
;
if
(
inout
)
return
(
-
ENOSYS
);
return
(
-
ENOSYS
);
*
start
=
buffer
+
offset
;
...
...
@@ -614,19 +600,15 @@ int fd_mcs_proc_info( char *buffer, char **start, off_t offset,
shpnt
=
hosts
[
i
];
if
(
!
shpnt
)
{
return
(
-
ENOENT
);
return
(
-
ENOENT
);
}
else
{
len
+=
sprintf
(
buffer
+
len
,
"Future Domain MCS-600/700 Driver %s
\n
"
,
DRIVER_VERSION
);
len
+=
sprintf
(
buffer
+
len
,
"Future Domain MCS-600/700 Driver %s
\n
"
,
DRIVER_VERSION
);
len
+=
sprintf
(
buffer
+
len
,
"HOST #%d: %s
\n
"
,
hostno
,
adapter_name
);
len
+=
sprintf
(
buffer
+
len
,
"HOST #%d: %s
\n
"
,
hostno
,
adapter_name
);
len
+=
sprintf
(
buffer
+
len
,
"FIFO Size=0x%x, FIFO Count=%d
\n
"
,
FIFO_Size
,
FIFO_COUNT
);
len
+=
sprintf
(
buffer
+
len
,
"FIFO Size=0x%x, FIFO Count=%d
\n
"
,
FIFO_Size
,
FIFO_COUNT
);
len
+=
sprintf
(
buffer
+
len
,
"DriverCalls=%d, Interrupts=%d, BytesRead=%d, BytesWrite=%d
\n\n
"
,
TOTAL_INTR
,
INTR_Processed
,
Bytes_Read
,
Bytes_Written
);
len
+=
sprintf
(
buffer
+
len
,
"DriverCalls=%d, Interrupts=%d, BytesRead=%d, BytesWrite=%d
\n\n
"
,
TOTAL_INTR
,
INTR_Processed
,
Bytes_Read
,
Bytes_Written
);
}
if
((
len
-=
offset
)
<=
0
)
...
...
@@ -636,25 +618,25 @@ int fd_mcs_proc_info( char *buffer, char **start, off_t offset,
return
len
;
}
static
int
fd_mcs_select
(
struct
Scsi_Host
*
shpnt
,
int
target
)
static
int
fd_mcs_select
(
struct
Scsi_Host
*
shpnt
,
int
target
)
{
int
status
;
unsigned
long
timeout
;
outb
(
0x82
,
SCSI_Cntl_port
);
/* Bus Enable + Select */
outb
(
adapter_mask
|
(
1
<<
target
),
SCSI_Data_NoACK_port
);
outb
(
0x82
,
SCSI_Cntl_port
);
/* Bus Enable + Select */
outb
(
adapter_mask
|
(
1
<<
target
),
SCSI_Data_NoACK_port
);
/* Stop arbitration and enable parity */
outb
(
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
PARITY_MASK
,
TMC_Cntl_port
);
timeout
=
350
;
/* 350mS -- because of timeouts
(was 250mS) */
do
{
status
=
inb
(
SCSI_Status_port
);
/* Read adapter status */
status
=
inb
(
SCSI_Status_port
);
/* Read adapter status */
if
(
status
&
1
)
{
/* Busy asserted */
/* Enable SCSI Bus (on error, should make bus idle with 0) */
outb
(
0x80
,
SCSI_Cntl_port
);
outb
(
0x80
,
SCSI_Cntl_port
);
return
0
;
}
udelay
(
1000
);
/* wait one msec */
...
...
@@ -663,7 +645,8 @@ static int fd_mcs_select(struct Scsi_Host *shpnt, int target )
/* Make bus idle */
fd_mcs_make_bus_idle
(
shpnt
);
#if EVERY_ACCESS
if
(
!
target
)
printk
(
"Selection failed
\n
"
);
if
(
!
target
)
printk
(
"Selection failed
\n
"
);
#endif
#if ERRORS_ONLY
if
(
!
target
)
{
...
...
@@ -672,22 +655,22 @@ static int fd_mcs_select(struct Scsi_Host *shpnt, int target )
if
(
!
flag
)
/* Skip first failure for all chips. */
++
flag
;
else
printk
(
"fd_mcs: Selection failed
\n
"
);
printk
(
"fd_mcs: Selection failed
\n
"
);
}
#endif
return
1
;
}
static
void
my_done
(
struct
Scsi_Host
*
shpnt
,
int
error
)
static
void
my_done
(
struct
Scsi_Host
*
shpnt
,
int
error
)
{
if
(
in_command
)
{
in_command
=
0
;
outb
(
0x00
,
Interrupt_Cntl_port
);
outb
(
0x00
,
Interrupt_Cntl_port
);
fd_mcs_make_bus_idle
(
shpnt
);
current_SC
->
result
=
error
;
current_SC
->
scsi_done
(
current_SC
);
current_SC
->
scsi_done
(
current_SC
);
}
else
{
panic
(
"fd_mcs: my_done() called outside of command
\n
"
);
panic
(
"fd_mcs: my_done() called outside of command
\n
"
);
}
#if DEBUG_RACE
in_interrupt_flag
=
0
;
...
...
@@ -695,7 +678,7 @@ static void my_done( struct Scsi_Host *shpnt, int error )
}
/* only my_done needs to be protected */
static
void
fd_mcs_intr
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
static
void
fd_mcs_intr
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
unsigned
long
flags
;
int
status
;
...
...
@@ -720,67 +703,66 @@ static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs )
INTR_Processed
++
;
outb
(
0x00
,
Interrupt_Cntl_port
);
outb
(
0x00
,
Interrupt_Cntl_port
);
/* Abort calls my_done, so we do nothing here. */
if
(
current_SC
->
SCp
.
phase
&
aborted
)
{
#if DEBUG_ABORT
printk
(
"Interrupt after abort, ignoring
\n
"
);
printk
(
"Interrupt after abort, ignoring
\n
"
);
#endif
/* return; */
}
#if DEBUG_RACE
++
in_interrupt_flag
;
#endif
if
(
current_SC
->
SCp
.
phase
&
in_arbitration
)
{
status
=
inb
(
TMC_Status_port
);
/* Read adapter status */
status
=
inb
(
TMC_Status_port
);
/* Read adapter status */
if
(
!
(
status
&
0x02
))
{
#if EVERY_ACCESS
printk
(
" AFAIL "
);
printk
(
" AFAIL "
);
#endif
spin_lock_irqsave
(
shpnt
->
host_lock
,
flags
);
my_done
(
shpnt
,
DID_BUS_BUSY
<<
16
);
my_done
(
shpnt
,
DID_BUS_BUSY
<<
16
);
spin_unlock_irqrestore
(
shpnt
->
host_lock
,
flags
);
return
;
}
current_SC
->
SCp
.
phase
=
in_selection
;
outb
(
0x40
|
FIFO_COUNT
,
Interrupt_Cntl_port
);
outb
(
0x40
|
FIFO_COUNT
,
Interrupt_Cntl_port
);
outb
(
0x82
,
SCSI_Cntl_port
);
/* Bus Enable + Select */
outb
(
adapter_mask
|
(
1
<<
current_SC
->
target
),
SCSI_Data_NoACK_port
);
outb
(
0x82
,
SCSI_Cntl_port
);
/* Bus Enable + Select */
outb
(
adapter_mask
|
(
1
<<
current_SC
->
target
),
SCSI_Data_NoACK_port
);
/* Stop arbitration and enable parity */
outb
(
0x10
|
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
0x10
|
PARITY_MASK
,
TMC_Cntl_port
);
#if DEBUG_RACE
in_interrupt_flag
=
0
;
#endif
return
;
}
else
if
(
current_SC
->
SCp
.
phase
&
in_selection
)
{
status
=
inb
(
SCSI_Status_port
);
status
=
inb
(
SCSI_Status_port
);
if
(
!
(
status
&
0x01
))
{
/* Try again, for slow devices */
if
(
fd_mcs_select
(
shpnt
,
current_SC
->
target
))
{
if
(
fd_mcs_select
(
shpnt
,
current_SC
->
target
))
{
#if EVERY_ACCESS
printk
(
" SFAIL "
);
printk
(
" SFAIL "
);
#endif
spin_lock_irqsave
(
shpnt
->
host_lock
,
flags
);
my_done
(
shpnt
,
DID_NO_CONNECT
<<
16
);
my_done
(
shpnt
,
DID_NO_CONNECT
<<
16
);
spin_unlock_irqrestore
(
shpnt
->
host_lock
,
flags
);
return
;
}
else
{
#if EVERY_ACCESS
printk
(
" AltSel "
);
printk
(
" AltSel "
);
#endif
/* Stop arbitration and enable parity */
outb
(
0x10
|
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
0x10
|
PARITY_MASK
,
TMC_Cntl_port
);
}
}
current_SC
->
SCp
.
phase
=
in_other
;
outb
(
0x90
|
FIFO_COUNT
,
Interrupt_Cntl_port
);
outb
(
0x80
,
SCSI_Cntl_port
);
outb
(
0x90
|
FIFO_COUNT
,
Interrupt_Cntl_port
);
outb
(
0x80
,
SCSI_Cntl_port
);
#if DEBUG_RACE
in_interrupt_flag
=
0
;
#endif
...
...
@@ -789,70 +771,61 @@ static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs )
/* current_SC->SCp.phase == in_other: this is the body of the routine */
status
=
inb
(
SCSI_Status_port
);
status
=
inb
(
SCSI_Status_port
);
if
(
status
&
0x10
)
{
/* REQ */
switch
(
status
&
0x0e
)
{
case
0x08
:
/* COMMAND OUT */
outb
(
current_SC
->
cmnd
[
current_SC
->
SCp
.
sent_command
++
],
Write_SCSI_Data_port
);
outb
(
current_SC
->
cmnd
[
current_SC
->
SCp
.
sent_command
++
],
Write_SCSI_Data_port
);
#if EVERY_ACCESS
printk
(
"CMD = %x,"
,
current_SC
->
cmnd
[
current_SC
->
SCp
.
sent_command
-
1
]
);
printk
(
"CMD = %x,"
,
current_SC
->
cmnd
[
current_SC
->
SCp
.
sent_command
-
1
]);
#endif
break
;
case
0x00
:
/* DATA OUT -- tmc18c50/tmc18c30 only */
if
(
chip
!=
tmc1800
&&
!
current_SC
->
SCp
.
have_data_in
)
{
current_SC
->
SCp
.
have_data_in
=
-
1
;
outb
(
0xd0
|
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
0xd0
|
PARITY_MASK
,
TMC_Cntl_port
);
}
break
;
case
0x04
:
/* DATA IN -- tmc18c50/tmc18c30 only */
if
(
chip
!=
tmc1800
&&
!
current_SC
->
SCp
.
have_data_in
)
{
current_SC
->
SCp
.
have_data_in
=
1
;
outb
(
0x90
|
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
0x90
|
PARITY_MASK
,
TMC_Cntl_port
);
}
break
;
case
0x0c
:
/* STATUS IN */
current_SC
->
SCp
.
Status
=
inb
(
Read_SCSI_Data_port
);
current_SC
->
SCp
.
Status
=
inb
(
Read_SCSI_Data_port
);
#if EVERY_ACCESS
printk
(
"Status = %x, "
,
current_SC
->
SCp
.
Status
);
printk
(
"Status = %x, "
,
current_SC
->
SCp
.
Status
);
#endif
#if ERRORS_ONLY
if
(
current_SC
->
SCp
.
Status
&&
current_SC
->
SCp
.
Status
!=
2
&&
current_SC
->
SCp
.
Status
!=
8
)
{
printk
(
"ERROR fd_mcs: target = %d, command = %x, status = %x
\n
"
,
current_SC
->
target
,
current_SC
->
cmnd
[
0
],
current_SC
->
SCp
.
Status
);
if
(
current_SC
->
SCp
.
Status
&&
current_SC
->
SCp
.
Status
!=
2
&&
current_SC
->
SCp
.
Status
!=
8
)
{
printk
(
"ERROR fd_mcs: target = %d, command = %x, status = %x
\n
"
,
current_SC
->
target
,
current_SC
->
cmnd
[
0
],
current_SC
->
SCp
.
Status
);
}
#endif
break
;
case
0x0a
:
/* MESSAGE OUT */
outb
(
MESSAGE_REJECT
,
Write_SCSI_Data_port
);
/* Reject */
outb
(
MESSAGE_REJECT
,
Write_SCSI_Data_port
);
/* Reject */
break
;
case
0x0e
:
/* MESSAGE IN */
current_SC
->
SCp
.
Message
=
inb
(
Read_SCSI_Data_port
);
current_SC
->
SCp
.
Message
=
inb
(
Read_SCSI_Data_port
);
#if EVERY_ACCESS
printk
(
"Message = %x, "
,
current_SC
->
SCp
.
Message
);
printk
(
"Message = %x, "
,
current_SC
->
SCp
.
Message
);
#endif
if
(
!
current_SC
->
SCp
.
Message
)
++
done
;
if
(
!
current_SC
->
SCp
.
Message
)
++
done
;
#if DEBUG_MESSAGES || EVERY_ACCESS
if
(
current_SC
->
SCp
.
Message
)
{
printk
(
"fd_mcs: message = %x
\n
"
,
current_SC
->
SCp
.
Message
);
printk
(
"fd_mcs: message = %x
\n
"
,
current_SC
->
SCp
.
Message
);
}
#endif
break
;
}
}
if
(
chip
==
tmc1800
&&
!
current_SC
->
SCp
.
have_data_in
&&
(
current_SC
->
SCp
.
sent_command
>=
current_SC
->
cmd_len
))
{
if
(
chip
==
tmc1800
&&
!
current_SC
->
SCp
.
have_data_in
&&
(
current_SC
->
SCp
.
sent_command
>=
current_SC
->
cmd_len
))
{
/* We have to get the FIFO direction
correct, so I've made a table based
on the SCSI Standard of which commands
...
...
@@ -980,59 +953,76 @@ static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs )
*/
switch
(
current_SC
->
cmnd
[
0
])
{
case
CHANGE_DEFINITION
:
case
COMPARE
:
case
COPY
:
case
COPY_VERIFY
:
case
LOG_SELECT
:
case
MODE_SELECT
:
case
MODE_SELECT_10
:
case
SEND_DIAGNOSTIC
:
case
WRITE_BUFFER
:
case
FORMAT_UNIT
:
case
REASSIGN_BLOCKS
:
case
RESERVE
:
case
SEARCH_EQUAL
:
case
SEARCH_HIGH
:
case
SEARCH_LOW
:
case
WRITE_6
:
case
WRITE_10
:
case
WRITE_VERIFY
:
case
0x3f
:
case
0x41
:
case
0xb1
:
case
0xb0
:
case
0xb2
:
case
0xaa
:
case
0xae
:
case
CHANGE_DEFINITION
:
case
COMPARE
:
case
COPY
:
case
COPY_VERIFY
:
case
LOG_SELECT
:
case
MODE_SELECT
:
case
MODE_SELECT_10
:
case
SEND_DIAGNOSTIC
:
case
WRITE_BUFFER
:
case
FORMAT_UNIT
:
case
REASSIGN_BLOCKS
:
case
RESERVE
:
case
SEARCH_EQUAL
:
case
SEARCH_HIGH
:
case
SEARCH_LOW
:
case
WRITE_6
:
case
WRITE_10
:
case
WRITE_VERIFY
:
case
0x3f
:
case
0x41
:
case
0xb1
:
case
0xb0
:
case
0xb2
:
case
0xaa
:
case
0xae
:
case
0x24
:
case
0x38
:
case
0x3d
:
case
0x38
:
case
0x3d
:
case
0xb6
:
case
0xea
:
/* alternate number for WRITE LONG */
current_SC
->
SCp
.
have_data_in
=
-
1
;
outb
(
0xd0
|
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
0xd0
|
PARITY_MASK
,
TMC_Cntl_port
);
break
;
case
0x00
:
default:
current_SC
->
SCp
.
have_data_in
=
1
;
outb
(
0x90
|
PARITY_MASK
,
TMC_Cntl_port
);
outb
(
0x90
|
PARITY_MASK
,
TMC_Cntl_port
);
break
;
}
}
if
(
current_SC
->
SCp
.
have_data_in
==
-
1
)
{
/* DATA OUT */
while
(
(
data_count
=
FIFO_Size
-
inw
(
FIFO_Data_Count_port
))
>
512
)
{
while
((
data_count
=
FIFO_Size
-
inw
(
FIFO_Data_Count_port
))
>
512
)
{
#if EVERY_ACCESS
printk
(
"DC=%d, "
,
data_count
)
;
printk
(
"DC=%d, "
,
data_count
)
;
#endif
if
(
data_count
>
current_SC
->
SCp
.
this_residual
)
data_count
=
current_SC
->
SCp
.
this_residual
;
if
(
data_count
>
0
)
{
#if EVERY_ACCESS
printk
(
"%d OUT, "
,
data_count
);
printk
(
"%d OUT, "
,
data_count
);
#endif
if
(
data_count
==
1
)
{
Bytes_Written
++
;
outb
(
*
current_SC
->
SCp
.
ptr
++
,
Write_FIFO_port
);
outb
(
*
current_SC
->
SCp
.
ptr
++
,
Write_FIFO_port
);
--
current_SC
->
SCp
.
this_residual
;
}
else
{
data_count
>>=
1
;
tmp_count
=
data_count
<<
1
;
outsw
(
Write_FIFO_port
,
current_SC
->
SCp
.
ptr
,
data_count
);
outsw
(
Write_FIFO_port
,
current_SC
->
SCp
.
ptr
,
data_count
);
current_SC
->
SCp
.
ptr
+=
tmp_count
;
Bytes_Written
+=
tmp_count
;
current_SC
->
SCp
.
this_residual
-=
tmp_count
;
...
...
@@ -1042,41 +1032,40 @@ static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs )
if
(
current_SC
->
SCp
.
buffers_residual
)
{
--
current_SC
->
SCp
.
buffers_residual
;
++
current_SC
->
SCp
.
buffer
;
current_SC
->
SCp
.
ptr
=
current_SC
->
SCp
.
buffer
->
address
;
current_SC
->
SCp
.
ptr
=
page_address
(
current_SC
->
SCp
.
buffer
->
page
)
+
current_SC
->
SCp
.
buffer
->
offset
;
current_SC
->
SCp
.
this_residual
=
current_SC
->
SCp
.
buffer
->
length
;
}
else
break
;
}
}
}
else
if
(
current_SC
->
SCp
.
have_data_in
==
1
)
{
/* DATA IN */
while
((
data_count
=
inw
(
FIFO_Data_Count_port
))
>
0
)
{
while
((
data_count
=
inw
(
FIFO_Data_Count_port
))
>
0
)
{
#if EVERY_ACCESS
printk
(
"DC=%d, "
,
data_count
);
printk
(
"DC=%d, "
,
data_count
);
#endif
if
(
data_count
>
current_SC
->
SCp
.
this_residual
)
data_count
=
current_SC
->
SCp
.
this_residual
;
if
(
data_count
)
{
#if EVERY_ACCESS
printk
(
"%d IN, "
,
data_count
);
printk
(
"%d IN, "
,
data_count
);
#endif
if
(
data_count
==
1
)
{
Bytes_Read
++
;
*
current_SC
->
SCp
.
ptr
++
=
inb
(
Read_FIFO_port
);
*
current_SC
->
SCp
.
ptr
++
=
inb
(
Read_FIFO_port
);
--
current_SC
->
SCp
.
this_residual
;
}
else
{
data_count
>>=
1
;
/* Number of words */
tmp_count
=
data_count
<<
1
;
insw
(
Read_FIFO_port
,
current_SC
->
SCp
.
ptr
,
data_count
);
insw
(
Read_FIFO_port
,
current_SC
->
SCp
.
ptr
,
data_count
);
current_SC
->
SCp
.
ptr
+=
tmp_count
;
Bytes_Read
+=
tmp_count
;
current_SC
->
SCp
.
this_residual
-=
tmp_count
;
}
}
if
(
!
current_SC
->
SCp
.
this_residual
&&
current_SC
->
SCp
.
buffers_residual
)
{
if
(
!
current_SC
->
SCp
.
this_residual
&&
current_SC
->
SCp
.
buffers_residual
)
{
--
current_SC
->
SCp
.
buffers_residual
;
++
current_SC
->
SCp
.
buffer
;
current_SC
->
SCp
.
ptr
=
current_SC
->
SCp
.
buffer
->
address
;
current_SC
->
SCp
.
ptr
=
page_address
(
current_SC
->
SCp
.
buffer
->
page
)
+
current_SC
->
SCp
.
buffer
->
offset
;
current_SC
->
SCp
.
this_residual
=
current_SC
->
SCp
.
buffer
->
length
;
}
}
...
...
@@ -1084,54 +1073,44 @@ static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs )
if
(
done
)
{
#if EVERY_ACCESS
printk
(
" ** IN DONE %d ** "
,
current_SC
->
SCp
.
have_data_in
);
printk
(
" ** IN DONE %d ** "
,
current_SC
->
SCp
.
have_data_in
);
#endif
#if ERRORS_ONLY
if
(
current_SC
->
cmnd
[
0
]
==
REQUEST_SENSE
&&
!
current_SC
->
SCp
.
Status
)
{
if
((
unsigned
char
)(
*
((
char
*
)
current_SC
->
request_buffer
+
2
))
&
0x0f
)
{
if
((
unsigned
char
)
(
*
((
char
*
)
current_SC
->
request_buffer
+
2
))
&
0x0f
)
{
unsigned
char
key
;
unsigned
char
code
;
unsigned
char
qualifier
;
key
=
(
unsigned
char
)(
*
((
char
*
)
current_SC
->
request_buffer
+
2
))
&
0x0f
;
code
=
(
unsigned
char
)(
*
((
char
*
)
current_SC
->
request_buffer
+
12
));
qualifier
=
(
unsigned
char
)(
*
((
char
*
)
current_SC
->
request_buffer
+
13
));
if
(
key
!=
UNIT_ATTENTION
&&
!
(
key
==
NOT_READY
&&
code
==
0x04
&&
(
!
qualifier
||
qualifier
==
0x02
||
qualifier
==
0x01
))
&&
!
(
key
==
ILLEGAL_REQUEST
&&
(
code
==
0x25
||
code
==
0x24
||
!
code
)))
printk
(
"fd_mcs: REQUEST SENSE "
"Key = %x, Code = %x, Qualifier = %x
\n
"
,
key
,
code
,
qualifier
);
key
=
(
unsigned
char
)
(
*
((
char
*
)
current_SC
->
request_buffer
+
2
))
&
0x0f
;
code
=
(
unsigned
char
)
(
*
((
char
*
)
current_SC
->
request_buffer
+
12
));
qualifier
=
(
unsigned
char
)
(
*
((
char
*
)
current_SC
->
request_buffer
+
13
));
if
(
key
!=
UNIT_ATTENTION
&&
!
(
key
==
NOT_READY
&&
code
==
0x04
&&
(
!
qualifier
||
qualifier
==
0x02
||
qualifier
==
0x01
))
&&
!
(
key
==
ILLEGAL_REQUEST
&&
(
code
==
0x25
||
code
==
0x24
||
!
code
)))
printk
(
"fd_mcs: REQUEST SENSE "
"Key = %x, Code = %x, Qualifier = %x
\n
"
,
key
,
code
,
qualifier
);
}
}
#endif
#if EVERY_ACCESS
printk
(
"BEFORE MY_DONE. . ."
);
printk
(
"BEFORE MY_DONE. . ."
);
#endif
spin_lock_irqsave
(
shpnt
->
host_lock
,
flags
);
my_done
(
shpnt
,
(
current_SC
->
SCp
.
Status
&
0xff
)
|
((
current_SC
->
SCp
.
Message
&
0xff
)
<<
8
)
|
(
DID_OK
<<
16
)
);
my_done
(
shpnt
,
(
current_SC
->
SCp
.
Status
&
0xff
)
|
((
current_SC
->
SCp
.
Message
&
0xff
)
<<
8
)
|
(
DID_OK
<<
16
));
spin_unlock_irqrestore
(
shpnt
->
host_lock
,
flags
);
#if EVERY_ACCESS
printk
(
"RETURNING.
\n
"
);
printk
(
"RETURNING.
\n
"
);
#endif
}
else
{
if
(
current_SC
->
SCp
.
phase
&
disconnect
)
{
outb
(
0xd0
|
FIFO_COUNT
,
Interrupt_Cntl_port
);
outb
(
0x00
,
SCSI_Cntl_port
);
outb
(
0xd0
|
FIFO_COUNT
,
Interrupt_Cntl_port
);
outb
(
0x00
,
SCSI_Cntl_port
);
}
else
{
outb
(
0x90
|
FIFO_COUNT
,
Interrupt_Cntl_port
);
outb
(
0x90
|
FIFO_COUNT
,
Interrupt_Cntl_port
);
}
}
#if DEBUG_RACE
...
...
@@ -1140,7 +1119,7 @@ static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs )
return
;
}
int
fd_mcs_release
(
struct
Scsi_Host
*
shpnt
)
static
int
fd_mcs_release
(
struct
Scsi_Host
*
shpnt
)
{
int
i
,
this_host
,
irq_usage
;
...
...
@@ -1162,26 +1141,22 @@ int fd_mcs_release(struct Scsi_Host *shpnt)
found
--
;
for
(
i
=
this_host
;
i
<
found
;
i
++
)
hosts
[
i
]
=
hosts
[
i
+
1
];
hosts
[
i
]
=
hosts
[
i
+
1
];
hosts
[
found
]
=
NULL
;
return
0
;
}
int
fd_mcs_queue
(
Scsi_Cmnd
*
SCpnt
,
void
(
*
done
)
(
Scsi_Cmnd
*
))
static
int
fd_mcs_queue
(
Scsi_Cmnd
*
SCpnt
,
void
(
*
done
)
(
Scsi_Cmnd
*
))
{
struct
Scsi_Host
*
shpnt
=
SCpnt
->
host
;
if
(
in_command
)
{
panic
(
"fd_mcs: fd_mcs_queue() NOT REENTRANT!
\n
"
);
panic
(
"fd_mcs: fd_mcs_queue() NOT REENTRANT!
\n
"
);
}
#if EVERY_ACCESS
printk
(
"queue: target = %d cmnd = 0x%02x pieces = %d size = %u
\n
"
,
SCpnt
->
target
,
*
(
unsigned
char
*
)
SCpnt
->
cmnd
,
SCpnt
->
use_sg
,
SCpnt
->
request_bufflen
);
printk
(
"queue: target = %d cmnd = 0x%02x pieces = %d size = %u
\n
"
,
SCpnt
->
target
,
*
(
unsigned
char
*
)
SCpnt
->
cmnd
,
SCpnt
->
use_sg
,
SCpnt
->
request_bufflen
);
#endif
fd_mcs_make_bus_idle
(
shpnt
);
...
...
@@ -1192,13 +1167,12 @@ int fd_mcs_queue( Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
/* Initialize static data */
if
(
current_SC
->
use_sg
)
{
current_SC
->
SCp
.
buffer
=
(
struct
scatterlist
*
)
current_SC
->
request_buffer
;
current_SC
->
SCp
.
ptr
=
current_SC
->
SCp
.
buffer
->
address
;
current_SC
->
SCp
.
buffer
=
(
struct
scatterlist
*
)
current_SC
->
request_buffer
;
current_SC
->
SCp
.
ptr
=
page_address
(
current_SC
->
SCp
.
buffer
->
page
)
+
current_SC
->
SCp
.
buffer
->
offset
;
current_SC
->
SCp
.
this_residual
=
current_SC
->
SCp
.
buffer
->
length
;
current_SC
->
SCp
.
buffers_residual
=
current_SC
->
use_sg
-
1
;
}
else
{
current_SC
->
SCp
.
ptr
=
(
char
*
)
current_SC
->
request_buffer
;
current_SC
->
SCp
.
ptr
=
(
char
*
)
current_SC
->
request_buffer
;
current_SC
->
SCp
.
this_residual
=
current_SC
->
request_bufflen
;
current_SC
->
SCp
.
buffer
=
NULL
;
current_SC
->
SCp
.
buffers_residual
=
0
;
...
...
@@ -1212,34 +1186,36 @@ int fd_mcs_queue( Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
current_SC
->
SCp
.
phase
=
in_arbitration
;
/* Start arbitration */
outb
(
0x00
,
Interrupt_Cntl_port
);
outb
(
0x00
,
SCSI_Cntl_port
);
/* Disable data drivers */
outb
(
adapter_mask
,
SCSI_Data_NoACK_port
);
/* Set our id bit */
outb
(
0x00
,
Interrupt_Cntl_port
);
outb
(
0x00
,
SCSI_Cntl_port
);
/* Disable data drivers */
outb
(
adapter_mask
,
SCSI_Data_NoACK_port
);
/* Set our id bit */
in_command
=
1
;
outb
(
0x20
,
Interrupt_Cntl_port
);
outb
(
0x14
|
PARITY_MASK
,
TMC_Cntl_port
);
/* Start arbitration */
outb
(
0x20
,
Interrupt_Cntl_port
);
outb
(
0x14
|
PARITY_MASK
,
TMC_Cntl_port
);
/* Start arbitration */
return
0
;
}
static
void
internal_done
(
Scsi_Cmnd
*
SCpnt
)
static
void
internal_done
(
Scsi_Cmnd
*
SCpnt
)
{
/* flag it done */
SCpnt
->
host_scribble
=
(
unsigned
char
*
)
1
;
SCpnt
->
host_scribble
=
(
unsigned
char
*
)
1
;
}
int
fd_mcs_command
(
Scsi_Cmnd
*
SCpnt
)
int
fd_mcs_command
(
Scsi_Cmnd
*
SCpnt
)
{
fd_mcs_queue
(
SCpnt
,
internal_done
);
fd_mcs_queue
(
SCpnt
,
internal_done
);
/* host_scribble is used for status here */
SCpnt
->
host_scribble
=
NULL
;
while
(
!
SCpnt
->
host_scribble
)
while
(
!
SCpnt
->
host_scribble
)
{
cpu_relax
();
barrier
();
}
return
SCpnt
->
result
;
}
#if DEBUG_ABORT || DEBUG_RESET
static
void
fd_mcs_print_info
(
Scsi_Cmnd
*
SCpnt
)
static
void
fd_mcs_print_info
(
Scsi_Cmnd
*
SCpnt
)
{
unsigned
int
imr
;
unsigned
int
irr
;
...
...
@@ -1247,90 +1223,88 @@ static void fd_mcs_print_info( Scsi_Cmnd *SCpnt )
struct
Scsi_Host
*
shpnt
=
SCpnt
->
host
;
if
(
!
SCpnt
||
!
SCpnt
->
host
)
{
printk
(
"fd_mcs: cannot provide detailed information
\n
"
);
printk
(
"fd_mcs: cannot provide detailed information
\n
"
);
}
printk
(
"%s
\n
"
,
fd_mcs_info
(
SCpnt
->
host
)
);
print_banner
(
SCpnt
->
host
);
printk
(
"%s
\n
"
,
fd_mcs_info
(
SCpnt
->
host
)
);
print_banner
(
SCpnt
->
host
);
switch
(
SCpnt
->
SCp
.
phase
)
{
case
in_arbitration
:
printk
(
"arbitration "
);
break
;
case
in_selection
:
printk
(
"selection "
);
break
;
case
in_other
:
printk
(
"other "
);
break
;
default:
printk
(
"unknown "
);
break
;
case
in_arbitration
:
printk
(
"arbitration "
);
break
;
case
in_selection
:
printk
(
"selection "
);
break
;
case
in_other
:
printk
(
"other "
);
break
;
default:
printk
(
"unknown "
);
break
;
}
printk
(
"(%d), target = %d cmnd = 0x%02x pieces = %d size = %u
\n
"
,
SCpnt
->
SCp
.
phase
,
SCpnt
->
target
,
*
(
unsigned
char
*
)
SCpnt
->
cmnd
,
SCpnt
->
use_sg
,
SCpnt
->
request_bufflen
);
printk
(
"sent_command = %d, have_data_in = %d, timeout = %d
\n
"
,
SCpnt
->
SCp
.
sent_command
,
SCpnt
->
SCp
.
have_data_in
,
SCpnt
->
timeout
);
printk
(
"(%d), target = %d cmnd = 0x%02x pieces = %d size = %u
\n
"
,
SCpnt
->
SCp
.
phase
,
SCpnt
->
target
,
*
(
unsigned
char
*
)
SCpnt
->
cmnd
,
SCpnt
->
use_sg
,
SCpnt
->
request_bufflen
);
printk
(
"sent_command = %d, have_data_in = %d, timeout = %d
\n
"
,
SCpnt
->
SCp
.
sent_command
,
SCpnt
->
SCp
.
have_data_in
,
SCpnt
->
timeout
);
#if DEBUG_RACE
printk
(
"in_interrupt_flag = %d
\n
"
,
in_interrupt_flag
);
printk
(
"in_interrupt_flag = %d
\n
"
,
in_interrupt_flag
);
#endif
imr
=
(
inb
(
0x0a1
)
<<
8
)
+
inb
(
0x21
);
outb
(
0x0a
,
0xa0
);
irr
=
inb
(
0xa0
)
<<
8
;
outb
(
0x0a
,
0x20
);
irr
+=
inb
(
0x20
);
outb
(
0x0b
,
0xa0
);
isr
=
inb
(
0xa0
)
<<
8
;
outb
(
0x0b
,
0x20
);
isr
+=
inb
(
0x20
);
imr
=
(
inb
(
0x0a1
)
<<
8
)
+
inb
(
0x21
);
outb
(
0x0a
,
0xa0
);
irr
=
inb
(
0xa0
)
<<
8
;
outb
(
0x0a
,
0x20
);
irr
+=
inb
(
0x20
);
outb
(
0x0b
,
0xa0
);
isr
=
inb
(
0xa0
)
<<
8
;
outb
(
0x0b
,
0x20
);
isr
+=
inb
(
0x20
);
/* Print out interesting information */
printk
(
"IMR = 0x%04x"
,
imr
);
printk
(
"IMR = 0x%04x"
,
imr
);
if
(
imr
&
(
1
<<
shpnt
->
irq
))
printk
(
" (masked)"
);
printk
(
", IRR = 0x%04x, ISR = 0x%04x
\n
"
,
irr
,
isr
);
printk
(
"SCSI Status = 0x%02x
\n
"
,
inb
(
SCSI_Status_port
)
);
printk
(
"TMC Status = 0x%02x"
,
inb
(
TMC_Status_port
)
);
if
(
inb
(
TMC_Status_port
)
&
1
)
printk
(
" (interrupt)"
);
printk
(
"
\n
"
);
printk
(
"Interrupt Status = 0x%02x"
,
inb
(
Interrupt_Status_port
)
);
if
(
inb
(
Interrupt_Status_port
)
&
0x08
)
printk
(
" (enabled)"
);
printk
(
"
\n
"
);
printk
(
" (masked)"
);
printk
(
", IRR = 0x%04x, ISR = 0x%04x
\n
"
,
irr
,
isr
);
printk
(
"SCSI Status = 0x%02x
\n
"
,
inb
(
SCSI_Status_port
)
);
printk
(
"TMC Status = 0x%02x"
,
inb
(
TMC_Status_port
)
);
if
(
inb
(
TMC_Status_port
)
&
1
)
printk
(
" (interrupt)"
);
printk
(
"
\n
"
);
printk
(
"Interrupt Status = 0x%02x"
,
inb
(
Interrupt_Status_port
)
);
if
(
inb
(
Interrupt_Status_port
)
&
0x08
)
printk
(
" (enabled)"
);
printk
(
"
\n
"
);
if
(
chip
==
tmc18c50
||
chip
==
tmc18c30
)
{
printk
(
"FIFO Status = 0x%02x
\n
"
,
inb
(
shpnt
->
io_port
+
FIFO_Status
)
);
printk
(
"Int. Condition = 0x%02x
\n
"
,
inb
(
shpnt
->
io_port
+
Interrupt_Cond
)
);
printk
(
"FIFO Status = 0x%02x
\n
"
,
inb
(
shpnt
->
io_port
+
FIFO_Status
));
printk
(
"Int. Condition = 0x%02x
\n
"
,
inb
(
shpnt
->
io_port
+
Interrupt_Cond
));
}
printk
(
"Configuration 1 = 0x%02x
\n
"
,
inb
(
shpnt
->
io_port
+
Configuration1
)
);
printk
(
"Configuration 1 = 0x%02x
\n
"
,
inb
(
shpnt
->
io_port
+
Configuration1
)
);
if
(
chip
==
tmc18c50
||
chip
==
tmc18c30
)
printk
(
"Configuration 2 = 0x%02x
\n
"
,
inb
(
shpnt
->
io_port
+
Configuration2
)
);
printk
(
"Configuration 2 = 0x%02x
\n
"
,
inb
(
shpnt
->
io_port
+
Configuration2
));
}
#endif
int
fd_mcs_abort
(
Scsi_Cmnd
*
SCpnt
)
static
int
fd_mcs_abort
(
Scsi_Cmnd
*
SCpnt
)
{
struct
Scsi_Host
*
shpnt
=
SCpnt
->
host
;
unsigned
long
flags
;
#if EVERY_ACCESS || ERRORS_ONLY || DEBUG_ABORT
printk
(
"fd_mcs: abort "
);
printk
(
"fd_mcs: abort "
);
#endif
save_flags
(
flags
);
cli
();
spin_lock_irqsave
(
shpnt
->
host_lock
,
flags
);
if
(
!
in_command
)
{
#if EVERY_ACCESS || ERRORS_ONLY
printk
(
" (not in command)
\n
"
);
printk
(
" (not in command)
\n
"
);
#endif
restore_flags
(
flags
);
return
SCSI_ABORT_NOT_RUNNING
;
}
else
printk
(
"
\n
"
);
spin_unlock_irqrestore
(
shpnt
->
host_lock
,
flags
);
return
FAILED
;
}
else
printk
(
"
\n
"
);
#if DEBUG_ABORT
fd_mcs_print_info
(
SCpnt
);
fd_mcs_print_info
(
SCpnt
);
#endif
fd_mcs_make_bus_idle
(
shpnt
);
...
...
@@ -1339,56 +1313,66 @@ int fd_mcs_abort( Scsi_Cmnd *SCpnt)
current_SC
->
result
=
DID_ABORT
<<
16
;
restore_flags
(
flags
);
/* Aborts are not done well. . . */
spin_lock_irqsave
(
shpnt
->
host_lock
,
flags
);
my_done
(
shpnt
,
DID_ABORT
<<
16
);
spin_unlock_irqrestore
(
shpnt
->
host_lock
,
flags
);
my_done
(
shpnt
,
DID_ABORT
<<
16
);
return
SCSI_ABORT_SUCCESS
;
spin_unlock_irqrestore
(
shpnt
->
host_lock
,
flags
);
return
SUCCESS
;
}
int
fd_mcs_reset
(
Scsi_Cmnd
*
SCpnt
,
unsigned
int
reset_flags
)
static
int
fd_mcs_host_reset
(
Scsi_Cmnd
*
SCpnt
)
{
return
FAILED
;
}
static
int
fd_mcs_device_reset
(
Scsi_Cmnd
*
SCpnt
)
{
return
FAILED
;
}
static
int
fd_mcs_bus_reset
(
Scsi_Cmnd
*
SCpnt
)
{
struct
Scsi_Host
*
shpnt
=
SCpnt
->
host
;
unsigned
long
flags
;
#if DEBUG_RESET
static
int
called_once
=
0
;
#endif
#if ERRORS_ONLY
if
(
SCpnt
)
printk
(
"fd_mcs: SCSI Bus Reset
\n
"
);
if
(
SCpnt
)
printk
(
"fd_mcs: SCSI Bus Reset
\n
"
);
#endif
#if DEBUG_RESET
if
(
called_once
)
fd_mcs_print_info
(
current_SC
);
if
(
called_once
)
fd_mcs_print_info
(
current_SC
);
called_once
=
1
;
#endif
outb
(
1
,
SCSI_Cntl_port
);
do_pause
(
2
);
outb
(
0
,
SCSI_Cntl_port
);
do_pause
(
115
);
outb
(
0
,
SCSI_Mode_Cntl_port
);
outb
(
PARITY_MASK
,
TMC_Cntl_port
);
spin_lock_irqsave
(
shpnt
->
host_lock
,
flags
);
outb
(
1
,
SCSI_Cntl_port
);
do_pause
(
2
);
outb
(
0
,
SCSI_Cntl_port
);
do_pause
(
115
);
outb
(
0
,
SCSI_Mode_Cntl_port
);
outb
(
PARITY_MASK
,
TMC_Cntl_port
);
/* Unless this is the very first call (i.e., SCPnt == NULL), everything
is probably hosed at this point. We will, however, try to keep
things going by informing the high-level code that we need help. */
return
SCSI_RESET_WAKEUP
;
}
spin_unlock_irqrestore
(
shpnt
->
host_lock
,
flags
);
return
SUCCESS
;
}
#include "sd.h"
#include <scsi/scsi_ioctl.h>
int
fd_mcs_biosparam
(
Scsi_Disk
*
disk
,
struct
block_device
*
bdev
,
int
*
info_array
)
{
unsigned
char
buf
[
512
+
sizeof
(
int
)
*
2
];
static
int
fd_mcs_biosparam
(
Scsi_Disk
*
disk
,
struct
block_device
*
bdev
,
int
*
info_array
)
{
unsigned
char
buf
[
512
+
sizeof
(
int
)
*
2
];
int
size
=
disk
->
capacity
;
int
*
sizes
=
(
int
*
)
buf
;
unsigned
char
*
data
=
(
unsigned
char
*
)
(
sizes
+
2
);
int
*
sizes
=
(
int
*
)
buf
;
unsigned
char
*
data
=
(
unsigned
char
*
)
(
sizes
+
2
);
unsigned
char
do_read
[]
=
{
READ_6
,
0
,
0
,
0
,
1
,
0
};
int
retcode
;
...
...
@@ -1397,10 +1381,8 @@ int fd_mcs_biosparam( Scsi_Disk *disk, struct block_device *bdev, int *info_arra
sizes
[
0
]
=
0
;
/* zero bytes out */
sizes
[
1
]
=
512
;
/* one sector in */
memcpy
(
data
,
do_read
,
sizeof
(
do_read
)
);
retcode
=
kernel_scsi_ioctl
(
disk
->
device
,
SCSI_IOCTL_SEND_COMMAND
,
(
void
*
)
buf
);
memcpy
(
data
,
do_read
,
sizeof
(
do_read
));
retcode
=
kernel_scsi_ioctl
(
disk
->
device
,
SCSI_IOCTL_SEND_COMMAND
,
(
void
*
)
buf
);
if
(
!
retcode
/* SCSI command ok */
&&
data
[
511
]
==
0xaa
&&
data
[
510
]
==
0x55
/* Partition table valid */
&&
data
[
0x1c2
])
{
/* Partition type */
...
...
@@ -1442,10 +1424,10 @@ int fd_mcs_biosparam( Scsi_Disk *disk, struct block_device *bdev, int *info_arra
less than 1024 cylinders on a platter. This is good for drives
up to approximately 7.85GB (where 1GB = 1024 * 1024 kB). */
if
((
unsigned
int
)
size
>=
0x7e0000U
)
{
if
((
unsigned
int
)
size
>=
0x7e0000U
)
{
info_array
[
0
]
=
0xff
;
/* heads = 255 */
info_array
[
1
]
=
0x3f
;
/* sectors = 63 */
}
else
if
((
unsigned
int
)
size
>=
0x200000U
)
{
}
else
if
((
unsigned
int
)
size
>=
0x200000U
)
{
info_array
[
0
]
=
0x80
;
/* heads = 128 */
info_array
[
1
]
=
0x3f
;
/* sectors = 63 */
}
else
{
...
...
@@ -1454,13 +1436,13 @@ int fd_mcs_biosparam( Scsi_Disk *disk, struct block_device *bdev, int *info_arra
}
}
/* For both methods, compute the cylinders */
info_array
[
2
]
=
(
unsigned
int
)
size
/
(
info_array
[
0
]
*
info_array
[
1
]
);
info_array
[
2
]
=
(
unsigned
int
)
size
/
(
info_array
[
0
]
*
info_array
[
1
]
);
return
0
;
}
}
/* Eventually this will go into an include file, but this will be later */
static
Scsi_Host_Template
driver_template
=
FD_MCS
;
static
Scsi_Host_Template
driver_template
=
FD_MCS
;
#include "scsi_module.c"
drivers/scsi/fd_mcs.h
View file @
ee29d109
...
...
@@ -22,15 +22,17 @@
#ifndef _FD_MCS_H
#define _FD_MCS_H
extern
int
fd_mcs_detect
(
Scsi_Host_Template
*
);
extern
int
fd_mcs_release
(
struct
Scsi_Host
*
);
extern
int
fd_mcs_command
(
Scsi_Cmnd
*
);
extern
int
fd_mcs_abort
(
Scsi_Cmnd
*
);
extern
int
fd_mcs_reset
(
Scsi_Cmnd
*
,
unsigned
int
);
extern
int
fd_mcs_queue
(
Scsi_Cmnd
*
,
void
(
*
done
)(
Scsi_Cmnd
*
)
);
extern
int
fd_mcs_biosparam
(
Disk
*
,
struct
block_device
*
,
int
*
);
extern
int
fd_mcs_proc_info
(
char
*
,
char
**
,
off_t
,
int
,
int
,
int
);
extern
const
char
*
fd_mcs_info
(
struct
Scsi_Host
*
);
static
int
fd_mcs_detect
(
Scsi_Host_Template
*
);
static
int
fd_mcs_release
(
struct
Scsi_Host
*
);
static
int
fd_mcs_command
(
Scsi_Cmnd
*
);
static
int
fd_mcs_abort
(
Scsi_Cmnd
*
);
static
int
fd_mcs_bus_reset
(
Scsi_Cmnd
*
);
static
int
fd_mcs_device_reset
(
Scsi_Cmnd
*
);
static
int
fd_mcs_host_reset
(
Scsi_Cmnd
*
);
static
int
fd_mcs_queue
(
Scsi_Cmnd
*
,
void
(
*
done
)
(
Scsi_Cmnd
*
));
static
int
fd_mcs_biosparam
(
Disk
*
,
struct
block_device
*
,
int
*
);
static
int
fd_mcs_proc_info
(
char
*
,
char
**
,
off_t
,
int
,
int
,
int
);
static
const
char
*
fd_mcs_info
(
struct
Scsi_Host
*
);
#define FD_MCS {\
proc_name: "fd_mcs", \
...
...
@@ -40,13 +42,16 @@ extern const char *fd_mcs_info(struct Scsi_Host *);
info: fd_mcs_info, \
command: fd_mcs_command, \
queuecommand: fd_mcs_queue, \
abort: fd_mcs_abort, \
reset: fd_mcs_reset, \
eh_abort_handler: fd_mcs_abort, \
eh_bus_reset_handler: fd_mcs_bus_reset, \
eh_host_reset_handler: fd_mcs_host_reset, \
eh_device_reset_handler: fd_mcs_device_reset, \
bios_param: fd_mcs_biosparam, \
can_queue: 1, \
this_id: 7, \
sg_tablesize: 64, \
cmd_per_lun: 1, \
use_clustering: DISABLE_CLUSTERING }
use_clustering: DISABLE_CLUSTERING \
}
#endif
/* _FD_MCS_H */
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