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
Kirill Smelkov
linux
Commits
3975cb41
Commit
3975cb41
authored
Apr 21, 2004
by
Ralf Bächle
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] Au1000 IrDA driver update
Get to build under 2.6, random updates to debugging code, new eval boards.
parent
a8588521
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
61 additions
and
49 deletions
+61
-49
drivers/net/irda/au1k_ir.c
drivers/net/irda/au1k_ir.c
+61
-49
No files found.
drivers/net/irda/au1k_ir.c
View file @
3975cb41
/*
*
* Alchemy Semi Au1000 IrDA driver
*
* Copyright 2001 MontaVista Software Inc.
* Author: MontaVista Software, Inc.
* ppopov@mvista.com or source@mvista.com
*
* ########################################################################
*
* This program is free software; you can distribute it and/or modify it
* under the terms of the GNU General Public License (Version 2) as
* published by the Free Software Foundation.
...
...
@@ -20,17 +17,7 @@
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
*
* ########################################################################
*
*
*/
#ifndef __mips__
#error This driver only works with MIPS architectures!
#endif
#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
...
...
@@ -46,7 +33,13 @@
#include <asm/bitops.h>
#include <asm/io.h>
#include <asm/au1000.h>
#if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100)
#include <asm/pb1000.h>
#elif defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
#include <asm/db1x00.h>
#else
#error au1k_ir: unsupported board
#endif
#include <net/irda/irda.h>
#include <net/irda/irmod.h>
...
...
@@ -71,10 +64,14 @@ static void dma_free(void *, size_t);
static
int
qos_mtt_bits
=
0x07
;
/* 1 ms or more */
static
struct
net_device
*
ir_devs
[
NUM_IR_IFF
];
static
char
version
[]
__devinitdata
=
"au1k_ircc:1.
0
ppopov@mvista.com
\n
"
;
"au1k_ircc:1.
2
ppopov@mvista.com
\n
"
;
#define RUN_AT(x) (jiffies + (x))
#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
static
BCSR
*
const
bcsr
=
(
BCSR
*
)
0xAE000000
;
#endif
static
spinlock_t
ir_lock
=
SPIN_LOCK_UNLOCKED
;
/*
...
...
@@ -128,7 +125,7 @@ static void *dma_alloc(size_t size, dma_addr_t * dma_handle)
if
(
ret
!=
NULL
)
{
memset
(
ret
,
0
,
size
);
*
dma_handle
=
virt_to_bus
(
ret
);
ret
=
KSEG0ADDR
(
ret
);
ret
=
(
void
*
)
KSEG0ADDR
(
ret
);
}
return
ret
;
}
...
...
@@ -136,7 +133,7 @@ static void *dma_alloc(size_t size, dma_addr_t * dma_handle)
static
void
dma_free
(
void
*
vaddr
,
size_t
size
)
{
vaddr
=
KSEG0ADDR
(
vaddr
);
vaddr
=
(
void
*
)
KSEG0ADDR
(
vaddr
);
free_pages
((
unsigned
long
)
vaddr
,
get_order
(
size
));
}
...
...
@@ -180,7 +177,7 @@ static int au1k_irda_init(void)
return
0
;
out1:
aup
=
dev
->
priv
;
aup
=
netdev_priv
(
dev
)
;
dma_free
((
void
*
)
aup
->
db
[
0
].
vaddr
,
MAX_BUF_SIZE
*
2
*
NUM_IR_DESC
);
dma_free
((
void
*
)
aup
->
rx_ring
[
0
],
...
...
@@ -205,10 +202,10 @@ static int au1k_irda_init_iobuf(iobuff_t *io, int size)
static
int
au1k_irda_net_init
(
struct
net_device
*
dev
)
{
struct
au1k_private
*
aup
=
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
int
i
,
retval
=
0
,
err
;
db_dest_t
*
pDB
,
*
pDBfree
;
unsigned
long
temp
;
dma_addr_t
temp
;
err
=
au1k_irda_init_iobuf
(
&
aup
->
rx_buff
,
14384
);
if
(
err
)
...
...
@@ -281,6 +278,14 @@ static int au1k_irda_net_init(struct net_device *dev)
aup
->
tx_ring
[
i
]
->
flags
=
0
;
aup
->
tx_db_inuse
[
i
]
=
pDB
;
}
#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
/* power on */
bcsr
->
resets
&=
~
BCSR_RESETS_IRDA_MODE_MASK
;
bcsr
->
resets
|=
BCSR_RESETS_IRDA_MODE_FULL
;
au_sync
();
#endif
return
0
;
out3:
...
...
@@ -296,7 +301,7 @@ static int au1k_irda_net_init(struct net_device *dev)
static
int
au1k_init
(
struct
net_device
*
dev
)
{
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
int
i
;
u32
control
;
u32
ring_address
;
...
...
@@ -340,13 +345,10 @@ static int au1k_irda_start(struct net_device *dev)
{
int
retval
;
char
hwname
[
32
];
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
MOD_INC_USE_COUNT
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
);
if
((
retval
=
au1k_init
(
dev
)))
{
printk
(
KERN_ERR
"%s: error in au1k_init
\n
"
,
dev
->
name
);
MOD_DEC_USE_COUNT
;
return
retval
;
}
...
...
@@ -354,7 +356,6 @@ static int au1k_irda_start(struct net_device *dev)
0
,
dev
->
name
,
dev
)))
{
printk
(
KERN_ERR
"%s: unable to get IRQ %d
\n
"
,
dev
->
name
,
dev
->
irq
);
MOD_DEC_USE_COUNT
;
return
retval
;
}
if
((
retval
=
request_irq
(
AU1000_IRDA_RX_INT
,
&
au1k_irda_interrupt
,
...
...
@@ -362,7 +363,6 @@ static int au1k_irda_start(struct net_device *dev)
free_irq
(
AU1000_IRDA_TX_INT
,
dev
);
printk
(
KERN_ERR
"%s: unable to get IRQ %d
\n
"
,
dev
->
name
,
dev
->
irq
);
MOD_DEC_USE_COUNT
;
return
retval
;
}
...
...
@@ -380,7 +380,7 @@ static int au1k_irda_start(struct net_device *dev)
static
int
au1k_irda_stop
(
struct
net_device
*
dev
)
{
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
/* disable interrupts */
writel
(
read_ir_reg
(
IR_CONFIG_2
)
&
~
(
1
<<
8
),
IR_CONFIG_2
);
...
...
@@ -399,14 +399,13 @@ static int au1k_irda_stop(struct net_device *dev)
/* disable the interrupt */
free_irq
(
AU1000_IRDA_TX_INT
,
dev
);
free_irq
(
AU1000_IRDA_RX_INT
,
dev
);
MOD_DEC_USE_COUNT
;
return
0
;
}
static
void
__exit
au1k_irda_exit
(
void
)
{
struct
net_device
*
dev
=
ir_devs
[
0
];
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
unregister_netdev
(
dev
);
...
...
@@ -422,7 +421,7 @@ static void __exit au1k_irda_exit(void)
static
inline
void
update_tx_stats
(
struct
net_device
*
dev
,
u32
status
,
u32
pkt_len
)
{
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
struct
net_device_stats
*
ps
=
&
aup
->
stats
;
ps
->
tx_packets
++
;
...
...
@@ -437,7 +436,7 @@ update_tx_stats(struct net_device *dev, u32 status, u32 pkt_len)
static
void
au1k_tx_ack
(
struct
net_device
*
dev
)
{
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
volatile
ring_dest_t
*
ptxd
;
ptxd
=
aup
->
tx_ring
[
aup
->
tx_tail
];
...
...
@@ -480,7 +479,7 @@ static void au1k_tx_ack(struct net_device *dev)
*/
static
int
au1k_irda_hard_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
int
speed
=
irda_get_next_speed
(
skb
);
volatile
ring_dest_t
*
ptxd
;
u32
len
;
...
...
@@ -505,13 +504,13 @@ static int au1k_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
flags
=
ptxd
->
flags
;
if
(
flags
&
AU_OWN
)
{
printk
(
KERN_
INFO
"%s: tx_full
\n
"
,
dev
->
name
);
printk
(
KERN_
DEBUG
"%s: tx_full
\n
"
,
dev
->
name
);
netif_stop_queue
(
dev
);
aup
->
tx_full
=
1
;
return
1
;
}
else
if
(((
aup
->
tx_head
+
1
)
&
(
NUM_IR_DESC
-
1
))
==
aup
->
tx_tail
)
{
printk
(
KERN_
INFO
"%s: tx_full
\n
"
,
dev
->
name
);
printk
(
KERN_
DEBUG
"%s: tx_full
\n
"
,
dev
->
name
);
netif_stop_queue
(
dev
);
aup
->
tx_full
=
1
;
return
1
;
...
...
@@ -531,6 +530,7 @@ static int au1k_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
memcpy
((
void
*
)
pDB
->
vaddr
,
skb
->
data
,
skb
->
len
);
ptxd
->
count_0
=
skb
->
len
&
0xff
;
ptxd
->
count_1
=
(
skb
->
len
>>
8
)
&
0xff
;
}
else
{
/* SIR */
...
...
@@ -538,6 +538,7 @@ static int au1k_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
ptxd
->
count_0
=
len
&
0xff
;
ptxd
->
count_1
=
(
len
>>
8
)
&
0xff
;
ptxd
->
flags
|=
IR_DIS_CRC
;
au_writel
(
au_readl
(
0xae00000c
)
&
~
(
1
<<
13
),
0xae00000c
);
}
ptxd
->
flags
|=
AU_OWN
;
au_sync
();
...
...
@@ -556,7 +557,7 @@ static int au1k_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
static
inline
void
update_rx_stats
(
struct
net_device
*
dev
,
u32
status
,
u32
count
)
{
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
struct
net_device_stats
*
ps
=
&
aup
->
stats
;
ps
->
rx_packets
++
;
...
...
@@ -579,7 +580,7 @@ update_rx_stats(struct net_device *dev, u32 status, u32 count)
*/
static
int
au1k_irda_rx
(
struct
net_device
*
dev
)
{
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
struct
sk_buff
*
skb
;
volatile
ring_dest_t
*
prxd
;
u32
flags
,
count
;
...
...
@@ -650,7 +651,7 @@ void au1k_irda_interrupt(int irq, void *dev_id, struct pt_regs *regs)
static
void
au1k_tx_timeout
(
struct
net_device
*
dev
)
{
u32
speed
;
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
printk
(
KERN_ERR
"%s: tx timeout
\n
"
,
dev
->
name
);
speed
=
aup
->
speed
;
...
...
@@ -668,10 +669,13 @@ static int
au1k_irda_set_speed
(
struct
net_device
*
dev
,
int
speed
)
{
unsigned
long
flags
;
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
u32
control
;
int
ret
=
0
,
timeout
=
10
,
i
;
volatile
ring_dest_t
*
ptxd
;
#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
unsigned
long
irda_resets
;
#endif
if
(
speed
==
aup
->
speed
)
return
ret
;
...
...
@@ -717,10 +721,20 @@ au1k_irda_set_speed(struct net_device *dev, int speed)
ptxd
->
flags
=
AU_OWN
;
}
if
(
speed
==
4000000
)
if
(
speed
==
4000000
)
{
#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
bcsr
->
resets
|=
BCSR_RESETS_FIR_SEL
;
#else
/* Pb1000 and Pb1100 */
writel
(
1
<<
13
,
CPLD_AUX1
);
else
#endif
}
else
{
#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
bcsr
->
resets
&=
~
BCSR_RESETS_FIR_SEL
;
#else
/* Pb1000 and Pb1100 */
writel
(
readl
(
CPLD_AUX1
)
&
~
(
1
<<
13
),
CPLD_AUX1
);
#endif
}
switch
(
speed
)
{
case
9600
:
...
...
@@ -766,15 +780,15 @@ au1k_irda_set_speed(struct net_device *dev, int speed)
}
else
{
if
(
control
&
(
1
<<
11
))
printk
(
KERN_
INFO
"%s Valid SIR config
\n
"
,
dev
->
name
);
printk
(
KERN_
DEBUG
"%s Valid SIR config
\n
"
,
dev
->
name
);
if
(
control
&
(
1
<<
12
))
printk
(
KERN_
INFO
"%s Valid MIR config
\n
"
,
dev
->
name
);
printk
(
KERN_
DEBUG
"%s Valid MIR config
\n
"
,
dev
->
name
);
if
(
control
&
(
1
<<
13
))
printk
(
KERN_
INFO
"%s Valid FIR config
\n
"
,
dev
->
name
);
printk
(
KERN_
DEBUG
"%s Valid FIR config
\n
"
,
dev
->
name
);
if
(
control
&
(
1
<<
10
))
printk
(
KERN_
INFO
"%s TX enabled
\n
"
,
dev
->
name
);
printk
(
KERN_
DEBUG
"%s TX enabled
\n
"
,
dev
->
name
);
if
(
control
&
(
1
<<
9
))
printk
(
KERN_
INFO
"%s RX enabled
\n
"
,
dev
->
name
);
printk
(
KERN_
DEBUG
"%s RX enabled
\n
"
,
dev
->
name
);
}
spin_unlock_irqrestore
(
&
ir_lock
,
flags
);
...
...
@@ -785,7 +799,7 @@ static int
au1k_irda_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
ifreq
,
int
cmd
)
{
struct
if_irda_req
*
rq
=
(
struct
if_irda_req
*
)
ifreq
;
struct
au1k_private
*
aup
=
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
int
ret
=
-
EOPNOTSUPP
;
switch
(
cmd
)
{
...
...
@@ -826,14 +840,12 @@ au1k_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd)
static
struct
net_device_stats
*
au1k_irda_stats
(
struct
net_device
*
dev
)
{
struct
au1k_private
*
aup
=
(
struct
au1k_private
*
)
dev
->
priv
;
struct
au1k_private
*
aup
=
netdev_priv
(
dev
)
;
return
&
aup
->
stats
;
}
#ifdef MODULE
MODULE_AUTHOR
(
"Pete Popov <ppopov@mvista.com>"
);
MODULE_DESCRIPTION
(
"Au1000 IrDA Device Driver"
);
module_init
(
au1k_irda_init
);
module_exit
(
au1k_irda_exit
);
#endif
/* MODULE */
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