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
2f4734ea
Commit
2f4734ea
authored
Apr 20, 2003
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge redhat.com:/garz/repo/linus-2.5
into redhat.com:/garz/repo/net-drivers-2.5
parents
6f06499b
90447fbb
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
73 additions
and
57 deletions
+73
-57
drivers/net/rclanmtl.c
drivers/net/rclanmtl.c
+15
-15
drivers/net/rclanmtl.h
drivers/net/rclanmtl.h
+2
-1
drivers/net/rcpci45.c
drivers/net/rcpci45.c
+56
-41
No files found.
drivers/net/rclanmtl.c
View file @
2f4734ea
...
@@ -301,13 +301,13 @@ RCInitI2OMsgLayer (struct net_device *dev,
...
@@ -301,13 +301,13 @@ RCInitI2OMsgLayer (struct net_device *dev,
PPAB
pPab
;
PPAB
pPab
;
U32
pciBaseAddr
=
dev
->
base_addr
;
U32
pciBaseAddr
=
dev
->
base_addr
;
PDPA
pDpa
=
dev
->
priv
;
PDPA
pDpa
=
dev
->
priv
;
PU8
p_msgbuf
=
pDpa
->
PLanApiPA
;
PU8
p_msgbuf
=
pDpa
->
msgbuf
;
PU8
p_phymsgbuf
=
(
PU8
)
virt_to_bus
((
void
*
)
p_msgbuf
)
;
PU8
p_phymsgbuf
=
(
PU8
)
pDpa
->
msgbuf_dma
;
dprintk
dprintk
(
"InitI2O: Adapter:0x%04ux ATU:0x%08ulx msgbuf:
0x%08ulx
phymsgbuf:0x%08ulx
\n
"
(
"InitI2O: Adapter:0x%04ux ATU:0x%08ulx msgbuf:
%p
phymsgbuf:0x%08ulx
\n
"
"TransmitCallbackFunction:0x%08ulx ReceiveCallbackFunction:0x%08ulx
\n
"
,
"TransmitCallbackFunction:0x%08ulx ReceiveCallbackFunction:0x%08ulx
\n
"
,
pDpa
->
id
,
pciBaseAddr
,
(
u32
)
p_msgbuf
,
(
u32
)
p_phymsgbuf
,
pDpa
->
id
,
pciBaseAddr
,
p_msgbuf
,
(
u32
)
p_phymsgbuf
,
(
u32
)
TransmitCallbackFunction
,
(
u32
)
ReceiveCallbackFunction
);
(
u32
)
TransmitCallbackFunction
,
(
u32
)
ReceiveCallbackFunction
);
/* Check if this interface already initialized - if so, shut it down */
/* Check if this interface already initialized - if so, shut it down */
...
@@ -445,7 +445,7 @@ RCI2OSendPacket (struct net_device * dev, U32 InitiatorContext,
...
@@ -445,7 +445,7 @@ RCI2OSendPacket (struct net_device * dev, U32 InitiatorContext,
return
RC_RTN_FREE_Q_EMPTY
;
return
RC_RTN_FREE_Q_EMPTY
;
}
}
/* calc vir
ual address of msg - vir
ual already mapped to physical */
/* calc vir
tual address of msg - virt
ual already mapped to physical */
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
size
=
FillI2OMsgSGLFromTCB
(
pMsg
+
4
,
pTransCtrlBlock
);
size
=
FillI2OMsgSGLFromTCB
(
pMsg
+
4
,
pTransCtrlBlock
);
...
@@ -502,7 +502,7 @@ RCPostRecvBuffers (struct net_device * dev, PRCTCB pTransCtrlBlock)
...
@@ -502,7 +502,7 @@ RCPostRecvBuffers (struct net_device * dev, PRCTCB pTransCtrlBlock)
dprintk
(
"RCPostRecvBuffers(): Inbound Free Q empty!
\n
"
);
dprintk
(
"RCPostRecvBuffers(): Inbound Free Q empty!
\n
"
);
return
RC_RTN_FREE_Q_EMPTY
;
return
RC_RTN_FREE_Q_EMPTY
;
}
}
/* calc vir
ual address of msg - vir
ual already mapped to physical */
/* calc vir
tual address of msg - virt
ual already mapped to physical */
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
size
=
FillI2OMsgSGLFromTCB
(
pMsg
+
4
,
pTransCtrlBlock
);
size
=
FillI2OMsgSGLFromTCB
(
pMsg
+
4
,
pTransCtrlBlock
);
...
@@ -677,7 +677,7 @@ RCGetLinkStatistics (struct net_device *dev,
...
@@ -677,7 +677,7 @@ RCGetLinkStatistics (struct net_device *dev,
return
RC_RTN_FREE_Q_EMPTY
;
return
RC_RTN_FREE_Q_EMPTY
;
}
}
/* calc vir
ual address of msg - vir
ual already mapped to physical */
/* calc vir
tual address of msg - virt
ual already mapped to physical */
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
/*dprintk("Get82558Stats - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/
/*dprintk("Get82558Stats - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/
...
@@ -751,7 +751,7 @@ RCGetLinkStatus (struct net_device * dev, PU32 ReturnAddr,
...
@@ -751,7 +751,7 @@ RCGetLinkStatus (struct net_device * dev, PU32 ReturnAddr,
return
RC_RTN_FREE_Q_EMPTY
;
return
RC_RTN_FREE_Q_EMPTY
;
}
}
/* calc vir
ual address of msg - vir
ual already mapped to physical */
/* calc vir
tual address of msg - virt
ual already mapped to physical */
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
/*dprintk("Get82558LinkStatus - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/
/*dprintk("Get82558LinkStatus - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/
/*dprintk("Get82558LinkStatus - pMsg = 0x%08X, InQ msgOffset = 0x%08X\n", pMsg, msgOffset);*/
/*dprintk("Get82558LinkStatus - pMsg = 0x%08X, InQ msgOffset = 0x%08X\n", pMsg, msgOffset);*/
...
@@ -1452,7 +1452,7 @@ RCResetIOP (struct net_device * dev)
...
@@ -1452,7 +1452,7 @@ RCResetIOP (struct net_device * dev)
pMsg
[
7
]
=
0
;
pMsg
[
7
]
=
0
;
pMsg
[
8
]
=
1
;
/* return 1 byte */
pMsg
[
8
]
=
1
;
/* return 1 byte */
/* virual pointer to return buffer - clear first two dwords */
/* vir
t
ual pointer to return buffer - clear first two dwords */
p32
=
(
volatile
PU32
)
pPab
->
pLinOutMsgBlock
;
p32
=
(
volatile
PU32
)
pPab
->
pLinOutMsgBlock
;
p32
[
0
]
=
0
;
p32
[
0
]
=
0
;
p32
[
1
]
=
0
;
p32
[
1
]
=
0
;
...
@@ -1693,7 +1693,7 @@ SendI2OOutboundQInitMsg (PPAB pPab)
...
@@ -1693,7 +1693,7 @@ SendI2OOutboundQInitMsg (PPAB pPab)
return
RC_RTN_FREE_Q_EMPTY
;
return
RC_RTN_FREE_Q_EMPTY
;
}
}
/* calc vir
ual address of msg - vir
ual already mapped to physical */
/* calc vir
tual address of msg - virt
ual already mapped to physical */
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
dprintk
dprintk
...
@@ -1711,7 +1711,7 @@ SendI2OOutboundQInitMsg (PPAB pPab)
...
@@ -1711,7 +1711,7 @@ SendI2OOutboundQInitMsg (PPAB pPab)
/* phys address to return status - area right after PAB */
/* phys address to return status - area right after PAB */
pMsg
[
7
]
=
pPab
->
outMsgBlockPhyAddr
;
pMsg
[
7
]
=
pPab
->
outMsgBlockPhyAddr
;
/* virual pointer to return buffer - clear first two dwords */
/* vir
t
ual pointer to return buffer - clear first two dwords */
p32
=
(
PU32
)
pPab
->
pLinOutMsgBlock
;
p32
=
(
PU32
)
pPab
->
pLinOutMsgBlock
;
p32
[
0
]
=
0
;
p32
[
0
]
=
0
;
...
@@ -1779,7 +1779,7 @@ GetI2OStatus (PPAB pPab)
...
@@ -1779,7 +1779,7 @@ GetI2OStatus (PPAB pPab)
return
RC_RTN_FREE_Q_EMPTY
;
return
RC_RTN_FREE_Q_EMPTY
;
}
}
/* calc vir
ual address of msg - vir
ual already mapped to physical */
/* calc vir
tual address of msg - virt
ual already mapped to physical */
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
pMsg
[
0
]
=
NINE_WORD_MSG_SIZE
|
SGL_OFFSET_0
;
pMsg
[
0
]
=
NINE_WORD_MSG_SIZE
|
SGL_OFFSET_0
;
...
@@ -1793,7 +1793,7 @@ GetI2OStatus (PPAB pPab)
...
@@ -1793,7 +1793,7 @@ GetI2OStatus (PPAB pPab)
pMsg
[
7
]
=
0
;
pMsg
[
7
]
=
0
;
pMsg
[
8
]
=
88
;
/* return 88 bytes */
pMsg
[
8
]
=
88
;
/* return 88 bytes */
/* virual pointer to return buffer - clear first two dwords */
/* vir
t
ual pointer to return buffer - clear first two dwords */
p32
=
(
volatile
PU32
)
pPab
->
pLinOutMsgBlock
;
p32
=
(
volatile
PU32
)
pPab
->
pLinOutMsgBlock
;
p32
[
0
]
=
0
;
p32
[
0
]
=
0
;
p32
[
1
]
=
0
;
p32
[
1
]
=
0
;
...
@@ -1862,7 +1862,7 @@ SendEnableSysMsg (PPAB pPab)
...
@@ -1862,7 +1862,7 @@ SendEnableSysMsg (PPAB pPab)
return
RC_RTN_FREE_Q_EMPTY
;
return
RC_RTN_FREE_Q_EMPTY
;
}
}
/* calc vir
ual address of msg - vir
ual already mapped to physical */
/* calc vir
tual address of msg - virt
ual already mapped to physical */
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
pMsg
=
(
PU32
)
(
pPab
->
pPci45LinBaseAddr
+
msgOffset
);
dprintk
dprintk
...
@@ -1885,7 +1885,7 @@ SendEnableSysMsg (PPAB pPab)
...
@@ -1885,7 +1885,7 @@ SendEnableSysMsg (PPAB pPab)
** =========================================================================
** =========================================================================
** FillI2OMsgFromTCB()
** FillI2OMsgFromTCB()
**
**
** inputs pMsgU32 - virual pointer (mapped to physical) of message frame
** inputs pMsgU32 - vir
t
ual pointer (mapped to physical) of message frame
** pXmitCntrlBlock - pointer to caller buffer control block.
** pXmitCntrlBlock - pointer to caller buffer control block.
**
**
** fills in LAN SGL after Transaction Control Word or Bucket Count.
** fills in LAN SGL after Transaction Control Word or Bucket Count.
...
...
drivers/net/rclanmtl.h
View file @
2f4734ea
...
@@ -182,6 +182,7 @@ typedef struct {
...
@@ -182,6 +182,7 @@ typedef struct {
U32
pci_addr
;
/* the pci address of the adapter */
U32
pci_addr
;
/* the pci address of the adapter */
U32
pci_addr_len
;
U32
pci_addr_len
;
struct
pci_dev
*
pci_dev
;
struct
timer_list
timer
;
/* timer */
struct
timer_list
timer
;
/* timer */
struct
net_device_stats
stats
;
/* the statistics structure */
struct
net_device_stats
stats
;
/* the statistics structure */
unsigned
long
numOutRcvBuffers
;
/* number of outstanding receive buffers */
unsigned
long
numOutRcvBuffers
;
/* number of outstanding receive buffers */
...
@@ -189,7 +190,7 @@ typedef struct {
...
@@ -189,7 +190,7 @@ typedef struct {
unsigned
char
reboot
;
unsigned
char
reboot
;
unsigned
char
nexus
;
unsigned
char
nexus
;
PU8
msgbuf
;
/* Pointer to Lan Api Private Area */
PU8
msgbuf
;
/* Pointer to Lan Api Private Area */
PU8
PLanApiPA
;
/* Pointer to Lan Api Private Area (aligned) */
dma_addr_t
msgbuf_dma
;
PPAB
pPab
;
/* Pointer to the PCI Adapter Block */
PPAB
pPab
;
/* Pointer to the PCI Adapter Block */
}
*
PDPA
;
}
*
PDPA
;
...
...
drivers/net/rcpci45.c
View file @
2f4734ea
...
@@ -29,6 +29,8 @@
...
@@ -29,6 +29,8 @@
** along with this program; if not, write to the Free Software
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
**
** Francois Romieu, Apr 2003: Converted to pci DMA mapping API.
**
** Pete Popov, Oct 2001: Fixed a few bugs to make the driver functional
** Pete Popov, Oct 2001: Fixed a few bugs to make the driver functional
** again. Note that this card is not supported or manufactured by
** again. Note that this card is not supported or manufactured by
** RedCreek anymore.
** RedCreek anymore.
...
@@ -47,8 +49,6 @@
...
@@ -47,8 +49,6 @@
**
**
***************************************************************************/
***************************************************************************/
#error Please convert me to Documentation/DMA-mapping.txt
#include <linux/module.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/string.h>
...
@@ -66,7 +66,7 @@
...
@@ -66,7 +66,7 @@
#include <asm/uaccess.h>
#include <asm/uaccess.h>
static
char
version
[]
__initdata
=
static
char
version
[]
__initdata
=
"RedCreek Communications PCI linux driver version 2.2
0
\n
"
;
"RedCreek Communications PCI linux driver version 2.2
1
\n
"
;
#define RC_LINUX_MODULE
#define RC_LINUX_MODULE
#include "rclanmtl.h"
#include "rclanmtl.h"
...
@@ -95,6 +95,12 @@ static char version[] __initdata =
...
@@ -95,6 +95,12 @@ static char version[] __initdata =
*/
*/
#define MSG_BUF_SIZE 16384
#define MSG_BUF_SIZE 16384
/* 2003/04/20: I don't know about the hardware ability but the driver won't
* play safe with 64 bit addressing and DAC without NETIF_F_HIGHDMA doesn't
* really make sense anyway. Let's play safe - romieu.
*/
#define RCPCI45_DMA_MASK ((u64) 0xffffffff)
static
U32
DriverControlWord
;
static
U32
DriverControlWord
;
static
void
rc_timer
(
unsigned
long
);
static
void
rc_timer
(
unsigned
long
);
...
@@ -136,8 +142,8 @@ rcpci45_remove_one (struct pci_dev *pdev)
...
@@ -136,8 +142,8 @@ rcpci45_remove_one (struct pci_dev *pdev)
free_irq
(
dev
->
irq
,
dev
);
free_irq
(
dev
->
irq
,
dev
);
iounmap
((
void
*
)
dev
->
base_addr
);
iounmap
((
void
*
)
dev
->
base_addr
);
pci_release_regions
(
pdev
);
pci_release_regions
(
pdev
);
if
(
pDpa
->
msgbuf
)
pci_free_consistent
(
pdev
,
MSG_BUF_SIZE
,
pDpa
->
msgbuf
,
kfree
(
pDpa
->
msgbuf
);
pDpa
->
msgbuf_dma
);
if
(
pDpa
->
pPab
)
if
(
pDpa
->
pPab
)
kfree
(
pDpa
->
pPab
);
kfree
(
pDpa
->
pPab
);
kfree
(
dev
);
kfree
(
dev
);
...
@@ -172,6 +178,7 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -172,6 +178,7 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
error
=
-
ENOMEM
;
error
=
-
ENOMEM
;
goto
err_out
;
goto
err_out
;
}
}
SET_MODULE_OWNER
(
dev
);
error
=
pci_enable_device
(
pdev
);
error
=
pci_enable_device
(
pdev
);
if
(
error
)
{
if
(
error
)
{
...
@@ -180,7 +187,6 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -180,7 +187,6 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
card_idx
);
card_idx
);
goto
err_out
;
goto
err_out
;
}
}
error
=
-
ENOMEM
;
pci_start
=
pci_resource_start
(
pdev
,
0
);
pci_start
=
pci_resource_start
(
pdev
,
0
);
pci_len
=
pci_resource_len
(
pdev
,
0
);
pci_len
=
pci_resource_len
(
pdev
,
0
);
printk
(
"pci_start %lx pci_len %lx
\n
"
,
pci_start
,
pci_len
);
printk
(
"pci_start %lx pci_len %lx
\n
"
,
pci_start
,
pci_len
);
...
@@ -189,6 +195,7 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -189,6 +195,7 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
pDpa
=
dev
->
priv
;
pDpa
=
dev
->
priv
;
pDpa
->
id
=
card_idx
;
pDpa
->
id
=
card_idx
;
pDpa
->
pci_dev
=
pdev
;
pDpa
->
pci_addr
=
pci_start
;
pDpa
->
pci_addr
=
pci_start
;
if
(
!
pci_start
||
!
(
pci_resource_flags
(
pdev
,
0
)
&
IORESOURCE_MEM
))
{
if
(
!
pci_start
||
!
(
pci_resource_flags
(
pdev
,
0
)
&
IORESOURCE_MEM
))
{
...
@@ -200,24 +207,21 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -200,24 +207,21 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
/*
/*
* pDpa->msgbuf is where the card will dma the I2O
* pDpa->msgbuf is where the card will dma the I2O
* messages. Thus, we need contiguous physical pages of
* messages. Thus, we need contiguous physical pages of memory.
* memory.
* 2003/04/20: pci_alloc_consistent() provides well over the needed
*/
* alignment on a 256 bytes boundary for the LAN API private area.
pDpa
->
msgbuf
=
kmalloc
(
MSG_BUF_SIZE
,
GFP_DMA
|
GFP_KERNEL
);
* Thus it isn't needed anymore to align it by hand.
*/
pDpa
->
msgbuf
=
pci_alloc_consistent
(
pdev
,
MSG_BUF_SIZE
,
&
pDpa
->
msgbuf_dma
);
if
(
!
pDpa
->
msgbuf
)
{
if
(
!
pDpa
->
msgbuf
)
{
printk
(
KERN_ERR
"(rcpci45 driver:) \
printk
(
KERN_ERR
"(rcpci45 driver:) \
Could not allocate %d byte memory for the \
Could not allocate %d byte memory for the \
private msgbuf!
\n
"
,
MSG_BUF_SIZE
);
private msgbuf!
\n
"
,
MSG_BUF_SIZE
);
error
=
-
ENOMEM
;
goto
err_out_free_dev
;
goto
err_out_free_dev
;
}
}
/*
* Save the starting address of the LAN API private area. We'll
* pass that to RCInitI2OMsgLayer().
*
*/
pDpa
->
PLanApiPA
=
(
void
*
)
(((
long
)
pDpa
->
msgbuf
+
0xff
)
&
~
0xff
);
/* The adapter is accessible through memory-access read/write, not
/* The adapter is accessible through memory-access read/write, not
* I/O read/write. Thus, we need to map it to some virtual address
* I/O read/write. Thus, we need to map it to some virtual address
* area in order to access the registers as normal memory.
* area in order to access the registers as normal memory.
...
@@ -226,12 +230,20 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -226,12 +230,20 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if
(
error
)
if
(
error
)
goto
err_out_free_msgbuf
;
goto
err_out_free_msgbuf
;
error
=
pci_set_dma_mask
(
pdev
,
RCPCI45_DMA_MASK
);
if
(
error
)
{
printk
(
KERN_ERR
"(rcpci45 driver:) pci_set_dma_mask failed!
\n
"
);
goto
err_out_free_region
;
}
vaddr
=
(
ulong
*
)
ioremap
(
pci_start
,
pci_len
);
vaddr
=
(
ulong
*
)
ioremap
(
pci_start
,
pci_len
);
if
(
!
vaddr
)
{
if
(
!
vaddr
)
{
printk
(
KERN_ERR
printk
(
KERN_ERR
"(rcpci45 driver:) \
"(rcpci45 driver:) \
Unable to remap address range from %lu to %lu
\n
"
,
Unable to remap address range from %lu to %lu
\n
"
,
pci_start
,
pci_start
+
pci_len
);
pci_start
,
pci_start
+
pci_len
);
error
=
-
EIO
;
goto
err_out_free_region
;
goto
err_out_free_region
;
}
}
...
@@ -249,13 +261,14 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
...
@@ -249,13 +261,14 @@ rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
err_out_free_region:
err_out_free_region:
pci_release_regions
(
pdev
);
pci_release_regions
(
pdev
);
err_out_free_msgbuf:
err_out_free_msgbuf:
kfree
(
pDpa
->
msgbuf
);
pci_free_consistent
(
pdev
,
MSG_BUF_SIZE
,
pDpa
->
msgbuf
,
pDpa
->
msgbuf_dma
);
err_out_free_dev:
err_out_free_dev:
unregister_netdev
(
dev
);
unregister_netdev
(
dev
);
kfree
(
dev
);
kfree
(
dev
);
err_out:
err_out:
card_idx
--
;
card_idx
--
;
return
-
ENODEV
;
return
error
;
}
}
static
struct
pci_driver
rcpci45_driver
=
{
static
struct
pci_driver
rcpci45_driver
=
{
...
@@ -283,7 +296,6 @@ RCopen (struct net_device *dev)
...
@@ -283,7 +296,6 @@ RCopen (struct net_device *dev)
int
requested
=
0
;
int
requested
=
0
;
int
error
;
int
error
;
MOD_INC_USE_COUNT
;
if
(
pDpa
->
nexus
)
{
if
(
pDpa
->
nexus
)
{
/* This is not the first time RCopen is called. Thus,
/* This is not the first time RCopen is called. Thus,
* the interface was previously opened and later closed
* the interface was previously opened and later closed
...
@@ -365,7 +377,6 @@ RCopen (struct net_device *dev)
...
@@ -365,7 +377,6 @@ RCopen (struct net_device *dev)
err_out_free_irq:
err_out_free_irq:
free_irq
(
dev
->
irq
,
dev
);
free_irq
(
dev
->
irq
,
dev
);
err_out:
err_out:
MOD_DEC_USE_COUNT
;
return
error
;
return
error
;
}
}
...
@@ -402,7 +413,8 @@ RC_xmit_packet (struct sk_buff *skb, struct net_device *dev)
...
@@ -402,7 +413,8 @@ RC_xmit_packet (struct sk_buff *skb, struct net_device *dev)
ptcb
->
b
.
context
=
(
U32
)
skb
;
ptcb
->
b
.
context
=
(
U32
)
skb
;
ptcb
->
b
.
scount
=
1
;
ptcb
->
b
.
scount
=
1
;
ptcb
->
b
.
size
=
skb
->
len
;
ptcb
->
b
.
size
=
skb
->
len
;
ptcb
->
b
.
addr
=
virt_to_bus
((
void
*
)
skb
->
data
);
ptcb
->
b
.
addr
=
pci_map_single
(
pDpa
->
pci_dev
,
skb
->
data
,
skb
->
len
,
PCI_DMA_TODEVICE
);
if
((
status
=
RCI2OSendPacket
(
dev
,
(
U32
)
NULL
,
(
PRCTCB
)
ptcb
))
if
((
status
=
RCI2OSendPacket
(
dev
,
(
U32
)
NULL
,
(
PRCTCB
)
ptcb
))
!=
RC_RTN_NO_ERROR
)
{
!=
RC_RTN_NO_ERROR
)
{
...
@@ -451,6 +463,8 @@ RCxmit_callback (U32 Status,
...
@@ -451,6 +463,8 @@ RCxmit_callback (U32 Status,
while
(
PcktCount
--
)
{
while
(
PcktCount
--
)
{
skb
=
(
struct
sk_buff
*
)
(
BufferContext
[
0
]);
skb
=
(
struct
sk_buff
*
)
(
BufferContext
[
0
]);
BufferContext
++
;
BufferContext
++
;
pci_unmap_single
(
pDpa
->
pci_dev
,
BufferContext
[
1
],
skb
->
len
,
PCI_DMA_TODEVICE
);
dev_kfree_skb_irq
(
skb
);
dev_kfree_skb_irq
(
skb
);
}
}
netif_wake_queue
(
dev
);
netif_wake_queue
(
dev
);
...
@@ -706,6 +720,7 @@ rc_timer (unsigned long data)
...
@@ -706,6 +720,7 @@ rc_timer (unsigned long data)
RCDisableI2OInterrupts
(
dev
);
RCDisableI2OInterrupts
(
dev
);
dev
->
flags
&=
~
IFF_UP
;
dev
->
flags
&=
~
IFF_UP
;
MOD_DEC_USE_COUNT
;
MOD_DEC_USE_COUNT
;
/* FIXME: kill MOD_DEC_USE_COUNT, use dev_put */
}
else
{
}
else
{
printk
(
KERN_INFO
"%s: rescheduling timer...
\n
"
,
printk
(
KERN_INFO
"%s: rescheduling timer...
\n
"
,
dev
->
name
);
dev
->
name
);
...
@@ -731,7 +746,6 @@ RCclose (struct net_device *dev)
...
@@ -731,7 +746,6 @@ RCclose (struct net_device *dev)
printk
(
KERN_INFO
"%s skipping reset -- adapter already in reboot mode
\n
"
,
dev
->
name
);
printk
(
KERN_INFO
"%s skipping reset -- adapter already in reboot mode
\n
"
,
dev
->
name
);
dev
->
flags
&=
~
IFF_UP
;
dev
->
flags
&=
~
IFF_UP
;
pDpa
->
shutdown
=
1
;
pDpa
->
shutdown
=
1
;
MOD_DEC_USE_COUNT
;
return
0
;
return
0
;
}
}
...
@@ -749,7 +763,6 @@ RCclose (struct net_device *dev)
...
@@ -749,7 +763,6 @@ RCclose (struct net_device *dev)
(
PFNCALLBACK
)
RCreset_callback
);
(
PFNCALLBACK
)
RCreset_callback
);
dev
->
flags
&=
~
IFF_UP
;
dev
->
flags
&=
~
IFF_UP
;
MOD_DEC_USE_COUNT
;
return
0
;
return
0
;
}
}
...
@@ -984,8 +997,9 @@ RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
...
@@ -984,8 +997,9 @@ RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
PU32
p
;
PU32
p
;
psingleB
pB
;
psingleB
pB
;
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
;
PDPA
pDpa
=
dev
->
priv
;
RC_RETURN
status
;
RC_RETURN
status
;
U32
res
;
U32
res
=
0
;
if
(
!
numBuffers
)
if
(
!
numBuffers
)
return
0
;
return
0
;
...
@@ -1001,7 +1015,7 @@ RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
...
@@ -1001,7 +1015,7 @@ RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
if
(
!
p
)
{
if
(
!
p
)
{
printk
(
KERN_WARNING
"%s unable to allocate TCB
\n
"
,
printk
(
KERN_WARNING
"%s unable to allocate TCB
\n
"
,
dev
->
name
);
dev
->
name
);
return
0
;
goto
out
;
}
}
p
[
0
]
=
0
;
/* Buffer Count */
p
[
0
]
=
0
;
/* Buffer Count */
...
@@ -1013,18 +1027,14 @@ RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
...
@@ -1013,18 +1027,14 @@ RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
printk
(
KERN_WARNING
printk
(
KERN_WARNING
"%s: unable to allocate enough skbs!
\n
"
,
"%s: unable to allocate enough skbs!
\n
"
,
dev
->
name
);
dev
->
name
);
if
(
*
p
!=
0
)
{
/* did we allocate any buffers */
goto
err_out_unmap
;
break
;
}
else
{
kfree
(
p
);
/* Free the TCB */
return
0
;
}
}
}
skb_reserve
(
skb
,
2
);
/* Align IP on 16 byte boundaries */
skb_reserve
(
skb
,
2
);
/* Align IP on 16 byte boundaries */
pB
->
context
=
(
U32
)
skb
;
pB
->
context
=
(
U32
)
skb
;
pB
->
scount
=
1
;
/* segment count */
pB
->
scount
=
1
;
/* segment count */
pB
->
size
=
MAX_ETHER_SIZE
;
pB
->
size
=
MAX_ETHER_SIZE
;
pB
->
addr
=
virt_to_bus
((
void
*
)
skb
->
data
);
pB
->
addr
=
pci_map_single
(
pDpa
->
pci_dev
,
skb
->
data
,
MAX_ETHER_SIZE
,
PCI_DMA_FROMDEVICE
);
p
[
0
]
++
;
p
[
0
]
++
;
pB
++
;
pB
++
;
}
}
...
@@ -1032,16 +1042,21 @@ RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
...
@@ -1032,16 +1042,21 @@ RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
if
((
status
=
RCPostRecvBuffers
(
dev
,
(
PRCTCB
)
p
))
!=
RC_RTN_NO_ERROR
)
{
if
((
status
=
RCPostRecvBuffers
(
dev
,
(
PRCTCB
)
p
))
!=
RC_RTN_NO_ERROR
)
{
printk
(
KERN_WARNING
"%s: Post buffer failed, error 0x%x
\n
"
,
printk
(
KERN_WARNING
"%s: Post buffer failed, error 0x%x
\n
"
,
dev
->
name
,
status
);
dev
->
name
,
status
);
/* point to the first buffer */
goto
err_out_unmap
;
pB
=
(
psingleB
)
((
U32
)
p
+
sizeof
(
U32
));
while
(
p
[
0
])
{
skb
=
(
struct
sk_buff
*
)
pB
->
context
;
dev_kfree_skb
(
skb
);
p
[
0
]
--
;
pB
++
;
}
}
}
out_free:
res
=
p
[
0
];
res
=
p
[
0
];
kfree
(
p
);
kfree
(
p
);
out:
return
(
res
);
/* return the number of posted buffers */
return
(
res
);
/* return the number of posted buffers */
err_out_unmap:
for
(;
p
[
0
]
>
0
;
p
[
0
]
--
)
{
--
pB
;
skb
=
(
struct
sk_buff
*
)
pB
->
context
;
pci_unmap_single
(
pDpa
->
pci_dev
,
pB
->
addr
,
MAX_ETHER_SIZE
,
PCI_DMA_FROMDEVICE
);
dev_kfree_skb
(
skb
);
}
goto
out_free
;
}
}
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