summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2011-06-02 20:01:34 +0000
committerShaun Ruffell <sruffell@digium.com>2011-06-02 20:01:34 +0000
commitcd419f86a583306c63a461b7e79a52e96c1e20bc (patch)
tree41b574bfc2b9ce4a87bbdfed680ed69895342198
parente1359adcca7980a13988af0366455bb2f4cb0980 (diff)
dahdi: Allow dahdi_span_ops.[chan|span]config and startup to block.
This change ensures that the dahdi_span_ops callbacks are not called with any spinlocks held, and that the module is pinned in memory, and also passes the struct file * pointer to the callbacks. Passing the file pointer to the callbacks allows the board drivers to check any flags on the file descriptor used to configure the span/channel. The intent here is to allow dahdi_config to open the /dev/dahdi/ctl file in a non-blocking mode in case there is a lengthy processes that needs to happen as part of configuration. Signed-off-by: Shaun Ruffell <sruffell@digium.com> Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com> git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9940 a0bf4364-ded3-4de4-8d8a-66a801d63aff
-rw-r--r--drivers/dahdi/dahdi-base.c23
-rw-r--r--drivers/dahdi/dahdi_dynamic.c3
-rw-r--r--drivers/dahdi/tor2.c12
-rw-r--r--drivers/dahdi/wcb4xxp/base.c12
-rw-r--r--drivers/dahdi/wct1xxp.c11
-rw-r--r--drivers/dahdi/wct4xxp/base.c13
-rw-r--r--drivers/dahdi/wctdm24xxp/xhfc.c5
-rw-r--r--drivers/dahdi/wctdm24xxp/xhfc.h5
-rw-r--r--drivers/dahdi/wcte11xp.c11
-rw-r--r--drivers/dahdi/wcte12xp/base.c10
-rw-r--r--drivers/dahdi/xpp/card_bri.c16
-rw-r--r--drivers/dahdi/xpp/card_pri.c10
-rw-r--r--include/dahdi/kernel.h10
13 files changed, 87 insertions, 54 deletions
diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c
index cbc2961..b91ec12 100644
--- a/drivers/dahdi/dahdi-base.c
+++ b/drivers/dahdi/dahdi-base.c
@@ -4373,7 +4373,7 @@ static const struct net_device_ops dahdi_netdev_ops = {
};
#endif
-static int dahdi_ioctl_chanconfig(unsigned long data)
+static int dahdi_ioctl_chanconfig(struct file *file, unsigned long data)
{
int res = 0;
int y;
@@ -4507,8 +4507,13 @@ static int dahdi_ioctl_chanconfig(unsigned long data)
chan->flags &= ~DAHDI_FLAG_MTP2;
}
+ /* Chanconfig can block, do not call through the function pointer with
+ * the channel lock held. */
+ spin_unlock_irqrestore(&chan->lock, flags);
if (!res && chan->span->ops->chanconfig)
- res = chan->span->ops->chanconfig(chan, ch.sigtype);
+ res = chan->span->ops->chanconfig(file, chan, ch.sigtype);
+ spin_lock_irqsave(&chan->lock, flags);
+
#ifdef CONFIG_DAHDI_NET
if (!res &&
@@ -4685,7 +4690,7 @@ static int dahdi_ioctl_indirect(struct file *file, unsigned long data)
return res;
}
-static int dahdi_ioctl_spanconfig(unsigned long data)
+static int dahdi_ioctl_spanconfig(struct file *file, unsigned long data)
{
int res = 0;
struct dahdi_lineconfig lc;
@@ -4708,13 +4713,13 @@ static int dahdi_ioctl_spanconfig(unsigned long data)
s->txlevel = lc.lbo;
s->rxlevel = 0;
- res = s->ops->spanconfig(s, &lc);
+ res = s->ops->spanconfig(file, s, &lc);
}
put_span(s);
return res;
}
-static int dahdi_ioctl_startup(unsigned long data)
+static int dahdi_ioctl_startup(struct file *file, unsigned long data)
{
/* I/O CTL's for control interface */
int j;
@@ -4735,7 +4740,7 @@ static int dahdi_ioctl_startup(unsigned long data)
}
if (s->ops->startup)
- res = s->ops->startup(s);
+ res = s->ops->startup(file, s);
if (!res) {
/* Mark as running and hangup any channels */
@@ -4986,15 +4991,15 @@ dahdi_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long data)
case DAHDI_INDIRECT:
return dahdi_ioctl_indirect(file, data);
case DAHDI_SPANCONFIG:
- return dahdi_ioctl_spanconfig(data);
+ return dahdi_ioctl_spanconfig(file, data);
case DAHDI_STARTUP:
- return dahdi_ioctl_startup(data);
+ return dahdi_ioctl_startup(file, data);
case DAHDI_SHUTDOWN:
return dahdi_ioctl_shutdown(data);
case DAHDI_ATTACH_ECHOCAN:
return dahdi_ioctl_attach_echocan(data);
case DAHDI_CHANCONFIG:
- return dahdi_ioctl_chanconfig(data);
+ return dahdi_ioctl_chanconfig(file, data);
case DAHDI_SFCONFIG:
return dahdi_ioctl_sfconfig(data);
case DAHDI_DEFAULTZONE:
diff --git a/drivers/dahdi/dahdi_dynamic.c b/drivers/dahdi/dahdi_dynamic.c
index 942329a..fd41676 100644
--- a/drivers/dahdi/dahdi_dynamic.c
+++ b/drivers/dahdi/dahdi_dynamic.c
@@ -511,7 +511,8 @@ static int dahdi_dynamic_open(struct dahdi_chan *chan)
return 0;
}
-static int dahdi_dynamic_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int dahdi_dynamic_chanconfig(struct file *file,
+ struct dahdi_chan *chan, int sigtype)
{
return 0;
}
diff --git a/drivers/dahdi/tor2.c b/drivers/dahdi/tor2.c
index fd96f9e..969f569 100644
--- a/drivers/dahdi/tor2.c
+++ b/drivers/dahdi/tor2.c
@@ -177,7 +177,7 @@ static int highestorder;
static int timingcable;
static void set_clear(struct tor2 *tor);
-static int tor2_startup(struct dahdi_span *span);
+static int tor2_startup(struct file *file, struct dahdi_span *span);
static int tor2_shutdown(struct dahdi_span *span);
static int tor2_rbsbits(struct dahdi_chan *chan, int bits);
static int tor2_maint(struct dahdi_span *span, int cmd);
@@ -193,7 +193,8 @@ static unsigned datxlt_e1[] = {
1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
25,26,27,28,29,30,31 };
-static int tor2_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+static int tor2_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
int i;
struct tor2_span *p = container_of(span, struct tor2_span, dahdi_span);
@@ -223,12 +224,13 @@ static int tor2_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
}
/* If we're already running, then go ahead and apply the changes */
if (span->flags & DAHDI_FLAG_RUNNING)
- return tor2_startup(span);
+ return tor2_startup(file, span);
return 0;
}
-static int tor2_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int tor2_chanconfig(struct file *file,
+ struct dahdi_chan *chan, int sigtype)
{
int alreadyrunning;
unsigned long flags;
@@ -811,7 +813,7 @@ static int tor2_shutdown(struct dahdi_span *span)
}
-static int tor2_startup(struct dahdi_span *span)
+static int tor2_startup(struct file *file, struct dahdi_span *span)
{
unsigned long endjif;
int i;
diff --git a/drivers/dahdi/wcb4xxp/base.c b/drivers/dahdi/wcb4xxp/base.c
index b8c684b..f36660d 100644
--- a/drivers/dahdi/wcb4xxp/base.c
+++ b/drivers/dahdi/wcb4xxp/base.c
@@ -2277,7 +2277,7 @@ static int b4xxp_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long
return 0;
}
-static int b4xxp_startup(struct dahdi_span *span)
+static int b4xxp_startup(struct file *file, struct dahdi_span *span)
{
struct b4xxp_span *bspan = container_of(span, struct b4xxp_span, span);
struct b4xxp *b4 = bspan->parent;
@@ -2310,7 +2310,8 @@ static void b4xxp_reset_span(struct b4xxp_span *bspan)
}
/* spanconfig for us means to set up the HFC FIFO and channel mapping */
-static int b4xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+static int b4xxp_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
int i;
struct b4xxp_span *bspan = container_of(span, struct b4xxp_span, span);
@@ -2347,7 +2348,7 @@ static int b4xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc
b4xxp_reset_span(bspan);
/* call startup() manually here, because DAHDI won't call the startup function unless it receives an IOCTL to do so, and dahdi_cfg doesn't. */
- b4xxp_startup(&bspan->span);
+ b4xxp_startup(file, &bspan->span);
span->flags |= DAHDI_FLAG_RUNNING;
@@ -2355,7 +2356,8 @@ static int b4xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc
}
/* chanconfig for us means to configure the HDLC controller, if appropriate */
-static int b4xxp_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int
+b4xxp_chanconfig(struct file *file, struct dahdi_chan *chan, int sigtype)
{
int alreadyrunning;
struct b4xxp *b4 = chan->pvt;
@@ -2820,7 +2822,7 @@ static int b4xxp_proc_read(char *buf, char **start, off_t offset, int count, int
static int b4xxp_startdefaultspan(struct b4xxp *b4)
{
struct dahdi_lineconfig lc = {0,};
- return b4xxp_spanconfig(&b4->spans[0].span, &lc);
+ return b4xxp_spanconfig(NULL, &b4->spans[0].span, &lc);
}
static int __devinit b4xx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
diff --git a/drivers/dahdi/wct1xxp.c b/drivers/dahdi/wct1xxp.c
index 28c86a8..fc8373e 100644
--- a/drivers/dahdi/wct1xxp.c
+++ b/drivers/dahdi/wct1xxp.c
@@ -608,7 +608,7 @@ static inline struct t1xxp *t1xxp_from_span(struct dahdi_span *span)
return container_of(span, struct t1xxp, span);
}
-static int t1xxp_startup(struct dahdi_span *span)
+static int t1xxp_startup(struct file *file, struct dahdi_span *span)
{
struct t1xxp *wc = t1xxp_from_span(span);
@@ -714,7 +714,8 @@ static int t1xxp_maint(struct dahdi_span *span, int cmd)
return res;
}
-static int t1xxp_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int
+t1xxp_chanconfig(struct file *file, struct dahdi_chan *chan, int sigtype)
{
struct t1xxp *wc = chan->pvt;
unsigned long flags;
@@ -729,7 +730,9 @@ static int t1xxp_chanconfig(struct dahdi_chan *chan, int sigtype)
return 0;
}
-static int t1xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+static int
+t1xxp_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
struct t1xxp *wc = t1xxp_from_span(span);
@@ -737,7 +740,7 @@ static int t1xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc
wc->sync = (lc->sync) ? 1 : 0;
/* If already running, apply changes immediately */
if (span->flags & DAHDI_FLAG_RUNNING)
- return t1xxp_startup(span);
+ return t1xxp_startup(file, span);
return 0;
}
diff --git a/drivers/dahdi/wct4xxp/base.c b/drivers/dahdi/wct4xxp/base.c
index 47c5ed3..f49fa43 100644
--- a/drivers/dahdi/wct4xxp/base.c
+++ b/drivers/dahdi/wct4xxp/base.c
@@ -416,7 +416,7 @@ static const struct dahdi_echocan_ops vpm_ec_ops = {
#endif
static void __set_clear(struct t4 *wc, int span);
-static int t4_startup(struct dahdi_span *span);
+static int t4_startup(struct file *file, struct dahdi_span *span);
static int t4_shutdown(struct dahdi_span *span);
static int t4_rbsbits(struct dahdi_chan *chan, int bits);
static int t4_maint(struct dahdi_span *span, int cmd);
@@ -1901,7 +1901,9 @@ static void t4_chan_set_sigcap(struct dahdi_span *span, int x)
}
}
-static int t4_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+static int
+t4_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
int i;
struct t4_span *ts = container_of(span, struct t4_span, span);
@@ -1943,14 +1945,15 @@ static int t4_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
/* If we're already running, then go ahead and apply the changes */
if (span->flags & DAHDI_FLAG_RUNNING)
- return t4_startup(span);
+ return t4_startup(file, span);
if (debug)
dev_info(&wc->dev->dev, "Done with spanconfig!\n");
return 0;
}
-static int t4_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int
+t4_chanconfig(struct file *file, struct dahdi_chan *chan, int sigtype)
{
int alreadyrunning;
unsigned long flags;
@@ -2671,7 +2674,7 @@ static void __t4_configure_e1(struct t4 *wc, int unit, int lineconfig)
wc->numspans, unit + 1, framing, line, crc4);
}
-static int t4_startup(struct dahdi_span *span)
+static int t4_startup(struct file *file, struct dahdi_span *span)
{
#ifdef SUPPORT_GEN1
int i;
diff --git a/drivers/dahdi/wctdm24xxp/xhfc.c b/drivers/dahdi/wctdm24xxp/xhfc.c
index fa63248..730d2e0 100644
--- a/drivers/dahdi/wctdm24xxp/xhfc.c
+++ b/drivers/dahdi/wctdm24xxp/xhfc.c
@@ -2175,7 +2175,8 @@ static int b400m_set_ntte(struct b400m_span *bspan, int te_mode, int term_on)
}
/* spanconfig for us means ...? */
-int b400m_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+int b400m_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
struct b400m_span *bspan;
struct b400m *b4;
@@ -2250,7 +2251,7 @@ int b400m_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
* The solution to that is to simply increment the span's "restart" flag, and
* the driver's workqueue will do the dirty work on our behalf.
*/
-int b400m_chanconfig(struct dahdi_chan *chan, int sigtype)
+int b400m_chanconfig(struct file *file, struct dahdi_chan *chan, int sigtype)
{
int alreadyrunning;
struct b400m_span *bspan = bspan_from_dspan(chan->span);
diff --git a/drivers/dahdi/wctdm24xxp/xhfc.h b/drivers/dahdi/wctdm24xxp/xhfc.h
index e058af6..825fa53 100644
--- a/drivers/dahdi/wctdm24xxp/xhfc.h
+++ b/drivers/dahdi/wctdm24xxp/xhfc.h
@@ -38,9 +38,10 @@ int wctdm_init_b400m(struct wctdm *wc, int card);
int wctdm_bri_checkisr(struct wctdm *wc, int card, int offset);
void wctdm_unload_b400m(struct wctdm *wc, int card);
void wctdm_hdlc_hard_xmit(struct dahdi_chan *chan);
-int b400m_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc);
+int b400m_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc);
int b400m_dchan(struct dahdi_span *span);
-int b400m_chanconfig(struct dahdi_chan *chan, int sigtype);
+int b400m_chanconfig(struct file *file, struct dahdi_chan *chan, int sigtype);
void b400m_post_init(struct b400m *b4);
void b400m_set_dahdi_span(struct b400m *b4, int spanno,
struct wctdm_span *wspan);
diff --git a/drivers/dahdi/wcte11xp.c b/drivers/dahdi/wcte11xp.c
index a0dbc79..c8067c7 100644
--- a/drivers/dahdi/wcte11xp.c
+++ b/drivers/dahdi/wcte11xp.c
@@ -878,7 +878,7 @@ static void t1xxp_framer_start(struct t1 *wc, struct dahdi_span *span)
}
-static int t1xxp_startup(struct dahdi_span *span)
+static int t1xxp_startup(struct file *file, struct dahdi_span *span)
{
struct t1 *wc = t1_from_span(span);
@@ -920,7 +920,8 @@ static int t1xxp_shutdown(struct dahdi_span *span)
}
-static int t1xxp_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int
+t1xxp_chanconfig(struct file *file, struct dahdi_chan *chan, int sigtype)
{
struct t1 *wc = chan->pvt;
unsigned long flags;
@@ -935,7 +936,9 @@ static int t1xxp_chanconfig(struct dahdi_chan *chan, int sigtype)
return 0;
}
-static int t1xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+static int
+t1xxp_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
struct t1 *wc = t1_from_span(span);
@@ -943,7 +946,7 @@ static int t1xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc
wc->sync = (lc->sync) ? 1 : 0;
/* If already running, apply changes immediately */
if (span->flags & DAHDI_FLAG_RUNNING)
- return t1xxp_startup(span);
+ return t1xxp_startup(file, span);
return 0;
}
diff --git a/drivers/dahdi/wcte12xp/base.c b/drivers/dahdi/wcte12xp/base.c
index 4610eac..1563855 100644
--- a/drivers/dahdi/wcte12xp/base.c
+++ b/drivers/dahdi/wcte12xp/base.c
@@ -929,7 +929,7 @@ static void set_span_devicetype(struct t1 *wc)
#endif
}
-static int t1xxp_startup(struct dahdi_span *span)
+static int t1xxp_startup(struct file *file, struct dahdi_span *span)
{
struct t1 *wc = container_of(span, struct t1, span);
#ifndef CONFIG_VOICEBUS_ECREFERENCE
@@ -954,7 +954,8 @@ static int t1xxp_startup(struct dahdi_span *span)
return 0;
}
-static int t1xxp_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int t1xxp_chanconfig(struct file *file,
+ struct dahdi_chan *chan, int sigtype)
{
struct t1 *wc = chan->pvt;
if (test_bit(DAHDI_FLAGBIT_RUNNING, &chan->span->flags) &&
@@ -1484,7 +1485,8 @@ static void t1_chan_set_sigcap(struct dahdi_span *span, int x)
}
static int
-t1xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+t1xxp_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
struct t1 *wc = container_of(span, struct t1, span);
int i;
@@ -1504,7 +1506,7 @@ t1xxp_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
/* If already running, apply changes immediately */
if (test_bit(DAHDI_FLAGBIT_RUNNING, &span->flags))
- return t1xxp_startup(span);
+ return t1xxp_startup(file, span);
return 0;
}
diff --git a/drivers/dahdi/xpp/card_bri.c b/drivers/dahdi/xpp/card_bri.c
index 7e4ae9a..f3b5565 100644
--- a/drivers/dahdi/xpp/card_bri.c
+++ b/drivers/dahdi/xpp/card_bri.c
@@ -162,9 +162,11 @@ static void bri_packet_dump(const char *msg, xpacket_t *pack);
#ifdef CONFIG_PROC_FS
static int proc_bri_info_read(char *page, char **start, off_t off, int count, int *eof, void *data);
#endif
-static int bri_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc);
-static int bri_chanconfig(struct dahdi_chan *chan, int sigtype);
-static int bri_startup(struct dahdi_span *span);
+static int bri_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc);
+static int bri_chanconfig(struct file *file, struct dahdi_chan *chan,
+ int sigtype);
+static int bri_startup(struct file *file, struct dahdi_span *span);
static int bri_shutdown(struct dahdi_span *span);
#define PROC_REGISTER_FNAME "slics"
@@ -1165,7 +1167,8 @@ static int BRI_card_close(xpd_t *xpd, lineno_t pos)
/*
* Called only for 'span' keyword in /etc/dahdi/system.conf
*/
-static int bri_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+static int bri_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
struct phonedev *phonedev = container_of(span, struct phonedev, span);
xpd_t *xpd = container_of(phonedev, struct xpd, phonedev);
@@ -1210,7 +1213,8 @@ static int bri_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
* Called from dahdi with spinlock held on chan. Must not call back
* dahdi functions.
*/
-static int bri_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int bri_chanconfig(struct file *file, struct dahdi_chan *chan,
+ int sigtype)
{
DBG(GENERAL, "channel %d (%s) -> %s\n", chan->channo, chan->name, sig2str(sigtype));
// FIXME: sanity checks:
@@ -1222,7 +1226,7 @@ static int bri_chanconfig(struct dahdi_chan *chan, int sigtype)
/*
* Called only for 'span' keyword in /etc/dahdi/system.conf
*/
-static int bri_startup(struct dahdi_span *span)
+static int bri_startup(struct file *file, struct dahdi_span *span)
{
struct phonedev *phonedev = container_of(span, struct phonedev, span);
xpd_t *xpd = container_of(phonedev, struct xpd, phonedev);
diff --git a/drivers/dahdi/xpp/card_pri.c b/drivers/dahdi/xpp/card_pri.c
index a2f755f..8d7e76d 100644
--- a/drivers/dahdi/xpp/card_pri.c
+++ b/drivers/dahdi/xpp/card_pri.c
@@ -75,7 +75,7 @@ static bool is_sigtype_dchan(int sigtype)
static bool pri_packet_is_valid(xpacket_t *pack);
static void pri_packet_dump(const char *msg, xpacket_t *pack);
-static int pri_startup(struct dahdi_span *span);
+static int pri_startup(struct file *file, struct dahdi_span *span);
static int pri_shutdown(struct dahdi_span *span);
static int pri_rbsbits(struct dahdi_chan *chan, int bits);
static int pri_lineconfig(xpd_t *xpd, int lineconfig);
@@ -1033,7 +1033,8 @@ bad_lineconfig:
* Called only for 'span' keyword in /etc/dahdi/system.conf
*/
-static int pri_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
+static int pri_spanconfig(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc)
{
struct phonedev *phonedev = container_of(span, struct phonedev, span);
xpd_t *xpd = container_of(phonedev, struct xpd, phonedev);
@@ -1068,7 +1069,8 @@ static int pri_spanconfig(struct dahdi_span *span, struct dahdi_lineconfig *lc)
* Called from dahdi with spinlock held on chan. Must not call back
* dahdi functions.
*/
-static int pri_chanconfig(struct dahdi_chan *chan, int sigtype)
+static int pri_chanconfig(struct file *file, struct dahdi_chan *chan,
+ int sigtype)
{
struct phonedev *phonedev = container_of(chan->span, struct phonedev, span);
xpd_t *xpd = container_of(phonedev, struct xpd, phonedev);
@@ -1455,7 +1457,7 @@ static int PRI_card_close(xpd_t *xpd, lineno_t pos)
/*
* Called only for 'span' keyword in /etc/dahdi/system.conf
*/
-static int pri_startup(struct dahdi_span *span)
+static int pri_startup(struct file *file, struct dahdi_span *span)
{
struct phonedev *phonedev = container_of(span, struct phonedev, span);
xpd_t *xpd = container_of(phonedev, struct xpd, phonedev);
diff --git a/include/dahdi/kernel.h b/include/dahdi/kernel.h
index 33b19cd..56a75cf 100644
--- a/include/dahdi/kernel.h
+++ b/include/dahdi/kernel.h
@@ -790,6 +790,8 @@ struct dahdi_count {
#define DAHDI_FLAG_TXUNDERRUN DAHDI_FLAG(TXUNDERRUN)
#define DAHDI_FLAG_RXOVERRUN DAHDI_FLAG(RXOVERRUN)
+struct file;
+
struct dahdi_span_ops {
struct module *owner; /*!< Which module is exporting this span. */
@@ -799,10 +801,11 @@ struct dahdi_span_ops {
int (*setchunksize)(struct dahdi_span *span, int chunksize);
/*! Opt: Configure the span (if appropriate) */
- int (*spanconfig)(struct dahdi_span *span, struct dahdi_lineconfig *lc);
+ int (*spanconfig)(struct file *file, struct dahdi_span *span,
+ struct dahdi_lineconfig *lc);
/*! Opt: Start the span */
- int (*startup)(struct dahdi_span *span);
+ int (*startup)(struct file *file, struct dahdi_span *span);
/*! Opt: Shutdown the span */
int (*shutdown)(struct dahdi_span *span);
@@ -817,7 +820,8 @@ struct dahdi_span_ops {
#endif
/* ==== Channel Callback Operations ==== */
/*! Opt: Set signalling type (if appropriate) */
- int (*chanconfig)(struct dahdi_chan *chan, int sigtype);
+ int (*chanconfig)(struct file *file, struct dahdi_chan *chan,
+ int sigtype);
/*! Opt: Prepare a channel for I/O */
int (*open)(struct dahdi_chan *chan);