summaryrefslogtreecommitdiff
path: root/drivers/dahdi/wcte12xp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dahdi/wcte12xp')
-rw-r--r--drivers/dahdi/wcte12xp/base.c56
-rw-r--r--drivers/dahdi/wcte12xp/wcte12xp.h2
2 files changed, 22 insertions, 36 deletions
diff --git a/drivers/dahdi/wcte12xp/base.c b/drivers/dahdi/wcte12xp/base.c
index 987de9b..235eea3 100644
--- a/drivers/dahdi/wcte12xp/base.c
+++ b/drivers/dahdi/wcte12xp/base.c
@@ -121,38 +121,29 @@ static void free_cmd(struct t1 *wc, struct command *cmd)
kmem_cache_free(cmd_cache, cmd);
}
-static struct command *get_pending_cmd(struct t1 *wc)
+static struct command *_get_pending_cmd(struct t1 *wc)
{
struct command *cmd = NULL;
- unsigned long flags;
- spin_lock_irqsave(&wc->cmd_list_lock, flags);
if (!list_empty(&wc->pending_cmds)) {
cmd = list_entry(wc->pending_cmds.next, struct command, node);
list_move_tail(&cmd->node, &wc->active_cmds);
}
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
return cmd;
}
static void submit_cmd(struct t1 *wc, struct command *cmd)
{
unsigned long flags;
- spin_lock_irqsave(&wc->cmd_list_lock, flags);
+ spin_lock_irqsave(&wc->reglock, flags);
list_add_tail(&cmd->node, &wc->pending_cmds);
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
+ spin_unlock_irqrestore(&wc->reglock, flags);
}
-static void resend_cmds(struct t1 *wc)
+static void _resend_cmds(struct t1 *wc)
{
- unsigned long flags;
- spin_lock_irqsave(&wc->cmd_list_lock, flags);
list_splice_init(&wc->active_cmds, &wc->pending_cmds);
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
-
- spin_lock_irqsave(&wc->reglock, flags);
if (wc->vpmadt032)
vpmadt032_resend(wc->vpmadt032);
- spin_unlock_irqrestore(&wc->reglock, flags);
}
static void cmd_dequeue(struct t1 *wc, unsigned char *eframe, int frame_num, int slot)
@@ -169,7 +160,7 @@ static void cmd_dequeue(struct t1 *wc, unsigned char *eframe, int frame_num, int
/* only 6 useable cs slots per */
/* framer */
- curcmd = get_pending_cmd(wc);
+ curcmd = _get_pending_cmd(wc);
if (curcmd) {
curcmd->cs_slot = slot;
curcmd->ident = wc->txident;
@@ -201,12 +192,11 @@ static void cmd_dequeue(struct t1 *wc, unsigned char *eframe, int frame_num, int
static inline void cmd_decipher(struct t1 *wc, const u8 *eframe)
{
struct command *cmd = NULL;
- unsigned long flags;
const int IS_VPM = 0;
/* Skip audio */
eframe += 66;
- spin_lock_irqsave(&wc->cmd_list_lock, flags);
+
while (!list_empty(&wc->active_cmds)) {
cmd = list_entry(wc->active_cmds.next, struct command, node);
if (cmd->ident != wc->rxident)
@@ -223,12 +213,10 @@ static inline void cmd_decipher(struct t1 *wc, const u8 *eframe)
complete(&cmd->complete);
}
}
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
}
inline void cmd_decipher_vpmadt032(struct t1 *wc, const u8 *eframe)
{
- unsigned long flags;
struct vpmadt032 *vpm = wc->vpmadt032;
struct vpmadt032_cmd *cmd;
@@ -240,14 +228,14 @@ inline void cmd_decipher_vpmadt032(struct t1 *wc, const u8 *eframe)
return;
}
- spin_lock_irqsave(&vpm->list_lock, flags);
+ spin_lock(&vpm->list_lock);
cmd = list_entry(vpm->active_cmds.next, struct vpmadt032_cmd, node);
if (wc->rxident == cmd->txident) {
list_del_init(&cmd->node);
} else {
cmd = NULL;
}
- spin_unlock_irqrestore(&vpm->list_lock, flags);
+ spin_unlock(&vpm->list_lock);
if (!cmd) {
return;
@@ -566,12 +554,12 @@ static int t1_getreg(struct t1 *wc, int addr)
submit_cmd(wc, cmd);
ret = wait_for_completion_interruptible_timeout(&cmd->complete, HZ*10);
if (unlikely(!ret)) {
- spin_lock_irqsave(&wc->cmd_list_lock, flags);
+ spin_lock_irqsave(&wc->reglock, flags);
if (!list_empty(&cmd->node)) {
/* Since we've removed this command from the list, we
* can go ahead and free it right away. */
list_del_init(&cmd->node);
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
+ spin_unlock_irqrestore(&wc->reglock, flags);
free_cmd(wc, cmd);
if (-ERESTARTSYS != ret) {
if (printk_ratelimit()) {
@@ -585,7 +573,7 @@ static int t1_getreg(struct t1 *wc, int addr)
/* Looks like this command was removed from the list by
* someone else already. Let's wait for them to complete
* it so that we don't free up the memory. */
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
+ spin_unlock_irqrestore(&wc->reglock, flags);
ret = wait_for_completion_timeout(&cmd->complete, HZ*2);
WARN_ON(!ret);
ret = cmd->data;
@@ -627,9 +615,9 @@ static inline int t1_getpins(struct t1 *wc, int inisr)
submit_cmd(wc, cmd);
ret = wait_for_completion_interruptible_timeout(&cmd->complete, HZ*2);
if (unlikely(!ret)) {
- spin_lock_irqsave(&wc->cmd_list_lock, flags);
+ spin_lock_irqsave(&wc->reglock, flags);
list_del_init(&cmd->node);
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
+ spin_unlock_irqrestore(&wc->reglock, flags);
free_cmd(wc, cmd);
if (-ERESTARTSYS != ret) {
if (printk_ratelimit()) {
@@ -687,10 +675,10 @@ static void free_wc(struct t1 *wc)
kfree(wc->ec[x]);
}
- spin_lock_irqsave(&wc->cmd_list_lock, flags);
+ spin_lock_irqsave(&wc->reglock, flags);
list_splice_init(&wc->active_cmds, &list);
list_splice_init(&wc->pending_cmds, &list);
- spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
+ spin_unlock_irqrestore(&wc->reglock, flags);
while (!list_empty(&list)) {
cmd = list_entry(list.next, struct command, node);
list_del_init(&cmd->node);
@@ -1865,7 +1853,6 @@ static inline void t1_transmitprep(struct t1 *wc, u8 *sframe)
int x;
int y;
int chan;
- unsigned long flags;
u8 *eframe = sframe;
/* Calculate Transmission */
@@ -1880,6 +1867,7 @@ static inline void t1_transmitprep(struct t1 *wc, u8 *sframe)
}
#endif
+ spin_lock(&wc->reglock);
for (x = 0; x < DAHDI_CHUNKSIZE; x++) {
if (likely(test_bit(INITIALIZED, &wc->bit_flags))) {
for (chan = 0; chan < wc->span.channels; chan++)
@@ -1891,10 +1879,8 @@ static inline void t1_transmitprep(struct t1 *wc, u8 *sframe)
cmd_dequeue(wc, eframe, x, y);
#ifdef VPM_SUPPORT
- spin_lock_irqsave(&wc->reglock, flags);
if (wc->vpmadt032)
cmd_dequeue_vpmadt032(wc, eframe);
- spin_unlock_irqrestore(&wc->reglock, flags);
#endif
if (x < DAHDI_CHUNKSIZE - 1) {
@@ -1903,6 +1889,7 @@ static inline void t1_transmitprep(struct t1 *wc, u8 *sframe)
}
eframe += (EFRAME_SIZE + EFRAME_GAP);
}
+ spin_unlock(&wc->reglock);
}
/**
@@ -1919,13 +1906,13 @@ static inline bool is_good_frame(const u8 *sframe)
static inline void t1_receiveprep(struct t1 *wc, const u8* sframe)
{
int x,chan;
- unsigned long flags;
unsigned char expected;
const u8 *eframe = sframe;
if (!is_good_frame(sframe))
return;
+ spin_lock(&wc->reglock);
for (x = 0; x < DAHDI_CHUNKSIZE; x++) {
if (likely(test_bit(INITIALIZED, &wc->bit_flags))) {
for (chan = 0; chan < wc->span.channels; chan++) {
@@ -1938,7 +1925,7 @@ static inline void t1_receiveprep(struct t1 *wc, const u8* sframe)
wc->statreg = eframe[EFRAME_SIZE + 2];
if (wc->rxident != expected) {
wc->span.irqmisses++;
- resend_cmds(wc);
+ _resend_cmds(wc);
if (unlikely(debug)) {
t1_info(wc, "oops: rxident=%d "
"expected=%d x=%d\n",
@@ -1948,13 +1935,13 @@ static inline void t1_receiveprep(struct t1 *wc, const u8* sframe)
}
cmd_decipher(wc, eframe);
#ifdef VPM_SUPPORT
- spin_lock_irqsave(&wc->reglock, flags);
if (wc->vpmadt032)
cmd_decipher_vpmadt032(wc, eframe);
- spin_unlock_irqrestore(&wc->reglock, flags);
#endif
eframe += (EFRAME_SIZE + EFRAME_GAP);
}
+
+ spin_unlock(&wc->reglock);
/* echo cancel */
if (likely(test_bit(INITIALIZED, &wc->bit_flags))) {
@@ -2228,7 +2215,6 @@ static int __devinit te12xp_init_one(struct pci_dev *pdev, const struct pci_devi
memset(wc, 0, sizeof(*wc));
wc->ledstate = -1;
spin_lock_init(&wc->reglock);
- spin_lock_init(&wc->cmd_list_lock);
INIT_LIST_HEAD(&wc->active_cmds);
INIT_LIST_HEAD(&wc->pending_cmds);
diff --git a/drivers/dahdi/wcte12xp/wcte12xp.h b/drivers/dahdi/wcte12xp/wcte12xp.h
index fa1afa8..5f6dbce 100644
--- a/drivers/dahdi/wcte12xp/wcte12xp.h
+++ b/drivers/dahdi/wcte12xp/wcte12xp.h
@@ -131,7 +131,7 @@ struct t1 {
unsigned long vpm_check;
struct work_struct vpm_check_work;
- spinlock_t cmd_list_lock;
+ /* protected by t1.reglock */
struct list_head pending_cmds;
struct list_head active_cmds;
struct timer_list timer;