Commit 5120022f authored by Kai Germaschewski's avatar Kai Germaschewski

ISDN/CAPI: Move methods from capi_driver to capi_ctr

parent 664fd502
...@@ -77,8 +77,8 @@ static struct tq_struct tq_recv_notify; ...@@ -77,8 +77,8 @@ static struct tq_struct tq_recv_notify;
static inline struct capi_ctr * static inline struct capi_ctr *
capi_ctr_get(struct capi_ctr *card) capi_ctr_get(struct capi_ctr *card)
{ {
if (card->driver->owner) { if (card->owner) {
if (try_inc_mod_count(card->driver->owner)) { if (try_inc_mod_count(card->owner)) {
DBG("MOD_COUNT INC"); DBG("MOD_COUNT INC");
return card; return card;
} else } else
...@@ -91,8 +91,8 @@ capi_ctr_get(struct capi_ctr *card) ...@@ -91,8 +91,8 @@ capi_ctr_get(struct capi_ctr *card)
static inline void static inline void
capi_ctr_put(struct capi_ctr *card) capi_ctr_put(struct capi_ctr *card)
{ {
if (card->driver->owner) if (card->owner)
__MOD_DEC_USE_COUNT(card->driver->owner); __MOD_DEC_USE_COUNT(card->owner);
DBG("MOD_COUNT DEC"); DBG("MOD_COUNT DEC");
} }
...@@ -157,7 +157,7 @@ static void register_appl(struct capi_ctr *card, u16 applid, capi_register_param ...@@ -157,7 +157,7 @@ static void register_appl(struct capi_ctr *card, u16 applid, capi_register_param
{ {
card = capi_ctr_get(card); card = capi_ctr_get(card);
card->driver->register_appl(card, applid, rparam); card->register_appl(card, applid, rparam);
} }
...@@ -165,7 +165,7 @@ static void release_appl(struct capi_ctr *card, u16 applid) ...@@ -165,7 +165,7 @@ static void release_appl(struct capi_ctr *card, u16 applid)
{ {
DBG("applid %#x", applid); DBG("applid %#x", applid);
card->driver->release_appl(card, applid); card->release_appl(card, applid);
capi_ctr_put(card); capi_ctr_put(card);
} }
...@@ -471,7 +471,7 @@ attach_capi_ctr(struct capi_ctr *card) ...@@ -471,7 +471,7 @@ attach_capi_ctr(struct capi_ctr *card)
if (card->procent) { if (card->procent) {
card->procent->read_proc = card->procent->read_proc =
(int (*)(char *,char **,off_t,int,int *,void *)) (int (*)(char *,char **,off_t,int,int *,void *))
card->driver->ctr_read_proc; card->ctr_read_proc;
card->procent->data = card; card->procent->data = card;
} }
...@@ -659,7 +659,7 @@ u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb) ...@@ -659,7 +659,7 @@ u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb)
} }
} }
return card->driver->send_message(card, skb); return card->send_message(card, skb);
} }
EXPORT_SYMBOL(capi20_put_message); EXPORT_SYMBOL(capi20_put_message);
...@@ -782,7 +782,7 @@ static int old_capi_manufacturer(unsigned int cmd, void *data) ...@@ -782,7 +782,7 @@ static int old_capi_manufacturer(unsigned int cmd, void *data)
card = capi_ctr_get(card); card = capi_ctr_get(card);
if (!card) if (!card)
return -ESRCH; return -ESRCH;
if (card->driver->load_firmware == 0) { if (card->load_firmware == 0) {
printk(KERN_DEBUG "kcapi: load: driver \%s\" has no load function\n", card->driver->name); printk(KERN_DEBUG "kcapi: load: driver \%s\" has no load function\n", card->driver->name);
return -ESRCH; return -ESRCH;
} }
...@@ -809,7 +809,7 @@ static int old_capi_manufacturer(unsigned int cmd, void *data) ...@@ -809,7 +809,7 @@ static int old_capi_manufacturer(unsigned int cmd, void *data)
} }
card->cardstate = CARD_LOADING; card->cardstate = CARD_LOADING;
retval = card->driver->load_firmware(card, &ldata); retval = card->load_firmware(card, &ldata);
if (retval) { if (retval) {
card->cardstate = CARD_DETECTED; card->cardstate = CARD_DETECTED;
...@@ -840,7 +840,7 @@ static int old_capi_manufacturer(unsigned int cmd, void *data) ...@@ -840,7 +840,7 @@ static int old_capi_manufacturer(unsigned int cmd, void *data)
if (card->cardstate == CARD_DETECTED) if (card->cardstate == CARD_DETECTED)
return 0; return 0;
card->driver->reset_ctr(card); card->reset_ctr(card);
while (card->cardstate > CARD_DETECTED) { while (card->cardstate > CARD_DETECTED) {
......
...@@ -101,10 +101,10 @@ static int controller_show(struct seq_file *seq, void *v) ...@@ -101,10 +101,10 @@ static int controller_show(struct seq_file *seq, void *v)
return 0; return 0;
seq_printf(seq, "%d %-10s %-8s %-16s %s\n", seq_printf(seq, "%d %-10s %-8s %-16s %s\n",
ctr->cnr, ctr->driver->name, ctr->cnr, ctr->driver->name,
cardstate2str(ctr->cardstate), cardstate2str(ctr->cardstate),
ctr->name, ctr->name,
ctr->driver->procinfo ? ctr->driver->procinfo(ctr) : ""); ctr->procinfo ? ctr->procinfo(ctr) : "");
return 0; return 0;
} }
......
...@@ -54,6 +54,8 @@ static void b1isa_remove(struct pci_dev *pdev) ...@@ -54,6 +54,8 @@ static void b1isa_remove(struct pci_dev *pdev)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static char *b1isa_procinfo(struct capi_ctr *ctrl);
static int __init b1isa_probe(struct pci_dev *pdev) static int __init b1isa_probe(struct pci_dev *pdev)
{ {
avmctrl_info *cinfo; avmctrl_info *cinfo;
...@@ -106,9 +108,18 @@ static int __init b1isa_probe(struct pci_dev *pdev) ...@@ -106,9 +108,18 @@ static int __init b1isa_probe(struct pci_dev *pdev)
b1_reset(card->port); b1_reset(card->port);
b1_getrevision(card); b1_getrevision(card);
cinfo->capi_ctrl.driver = &b1isa_driver; cinfo->capi_ctrl.driver = &b1isa_driver;
cinfo->capi_ctrl.driverdata = cinfo; cinfo->capi_ctrl.driverdata = cinfo;
cinfo->capi_ctrl.register_appl = b1_register_appl;
cinfo->capi_ctrl.release_appl = b1_release_appl;
cinfo->capi_ctrl.send_message = b1_send_message;
cinfo->capi_ctrl.load_firmware = b1_load_firmware;
cinfo->capi_ctrl.reset_ctr = b1_reset_ctr;
cinfo->capi_ctrl.procinfo = b1isa_procinfo;
cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
strcpy(cinfo->capi_ctrl.name, card->name); strcpy(cinfo->capi_ctrl.name, card->name);
SET_MODULE_OWNER(&cinfo->capi_ctrl);
retval = attach_capi_ctr(&cinfo->capi_ctrl); retval = attach_capi_ctr(&cinfo->capi_ctrl);
if (retval) { if (retval) {
printk(KERN_ERR "b1isa: attach controller failed.\n"); printk(KERN_ERR "b1isa: attach controller failed.\n");
...@@ -151,17 +162,8 @@ static char *b1isa_procinfo(struct capi_ctr *ctrl) ...@@ -151,17 +162,8 @@ static char *b1isa_procinfo(struct capi_ctr *ctrl)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static struct capi_driver b1isa_driver = { static struct capi_driver b1isa_driver = {
owner: THIS_MODULE,
name: "b1isa", name: "b1isa",
revision: "0.0", revision: "0.0",
load_firmware: b1_load_firmware,
reset_ctr: b1_reset_ctr,
register_appl: b1_register_appl,
release_appl: b1_release_appl,
send_message: b1_send_message,
procinfo: b1isa_procinfo,
ctr_read_proc: b1ctl_read_proc,
}; };
#define MAX_CARDS 4 #define MAX_CARDS 4
......
...@@ -107,9 +107,18 @@ static int b1pci_probe(struct capi_driver *driver, ...@@ -107,9 +107,18 @@ static int b1pci_probe(struct capi_driver *driver,
goto err_release_region; goto err_release_region;
} }
cinfo->capi_ctrl.driver = driver; cinfo->capi_ctrl.driver = driver;
cinfo->capi_ctrl.driverdata = cinfo; cinfo->capi_ctrl.driverdata = cinfo;
cinfo->capi_ctrl.register_appl = b1_register_appl;
cinfo->capi_ctrl.release_appl = b1_release_appl;
cinfo->capi_ctrl.send_message = b1_send_message;
cinfo->capi_ctrl.load_firmware = b1_load_firmware;
cinfo->capi_ctrl.reset_ctr = b1_reset_ctr;
cinfo->capi_ctrl.procinfo = b1pci_procinfo;
cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
strcpy(cinfo->capi_ctrl.name, card->name); strcpy(cinfo->capi_ctrl.name, card->name);
SET_MODULE_OWNER(&cinfo->capi_ctrl);
retval = attach_capi_ctr(&cinfo->capi_ctrl); retval = attach_capi_ctr(&cinfo->capi_ctrl);
if (retval) { if (retval) {
printk(KERN_ERR "%s: attach controller failed.\n", printk(KERN_ERR "%s: attach controller failed.\n",
...@@ -158,17 +167,8 @@ static void b1pci_remove(struct pci_dev *pdev) ...@@ -158,17 +167,8 @@ static void b1pci_remove(struct pci_dev *pdev)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static struct capi_driver b1pci_driver = { static struct capi_driver b1pci_driver = {
owner: THIS_MODULE,
name: "b1pci", name: "b1pci",
revision: "0.0", revision: "0.0",
load_firmware: b1_load_firmware,
reset_ctr: b1_reset_ctr,
register_appl: b1_register_appl,
release_appl: b1_release_appl,
send_message: b1_send_message,
procinfo: b1pci_procinfo,
ctr_read_proc: b1ctl_read_proc,
}; };
#ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4 #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
...@@ -258,9 +258,18 @@ static int b1pciv4_probe(struct capi_driver *driver, ...@@ -258,9 +258,18 @@ static int b1pciv4_probe(struct capi_driver *driver,
goto err_unmap; goto err_unmap;
} }
cinfo->capi_ctrl.driver = driver; cinfo->capi_ctrl.driver = driver;
cinfo->capi_ctrl.driverdata = cinfo; cinfo->capi_ctrl.driverdata = cinfo;
cinfo->capi_ctrl.register_appl = b1dma_register_appl;
cinfo->capi_ctrl.release_appl = b1dma_release_appl;
cinfo->capi_ctrl.send_message = b1dma_send_message;
cinfo->capi_ctrl.load_firmware = b1dma_load_firmware;
cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr;
cinfo->capi_ctrl.procinfo = b1pciv4_procinfo;
cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc;
strcpy(cinfo->capi_ctrl.name, card->name); strcpy(cinfo->capi_ctrl.name, card->name);
SET_MODULE_OWNER(&cinfo->capi_ctrl);
retval = attach_capi_ctr(&cinfo->capi_ctrl); retval = attach_capi_ctr(&cinfo->capi_ctrl);
if (retval) { if (retval) {
printk(KERN_ERR "%s: attach controller failed.\n", driver->name); printk(KERN_ERR "%s: attach controller failed.\n", driver->name);
...@@ -310,17 +319,8 @@ static void b1pciv4_remove(struct pci_dev *pdev) ...@@ -310,17 +319,8 @@ static void b1pciv4_remove(struct pci_dev *pdev)
static struct capi_driver b1pciv4_driver = { static struct capi_driver b1pciv4_driver = {
owner: THIS_MODULE,
name: "b1pciv4", name: "b1pciv4",
revision: "0.0", revision: "0.0",
load_firmware: b1dma_load_firmware,
reset_ctr: b1dma_reset_ctr,
register_appl: b1dma_register_appl,
release_appl: b1dma_release_appl,
send_message: b1dma_send_message,
procinfo: b1pciv4_procinfo,
ctr_read_proc: b1dmactl_read_proc,
}; };
#endif /* CONFIG_ISDN_DRV_AVMB1_B1PCIV4 */ #endif /* CONFIG_ISDN_DRV_AVMB1_B1PCIV4 */
......
...@@ -51,6 +51,8 @@ static void b1pcmcia_remove_ctr(struct capi_ctr *ctrl) ...@@ -51,6 +51,8 @@ static void b1pcmcia_remove_ctr(struct capi_ctr *ctrl)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static char *b1pcmcia_procinfo(struct capi_ctr *ctrl);
static int b1pcmcia_add_card(struct capi_driver *driver, static int b1pcmcia_add_card(struct capi_driver *driver,
unsigned int port, unsigned int port,
unsigned irq, unsigned irq,
...@@ -95,9 +97,18 @@ static int b1pcmcia_add_card(struct capi_driver *driver, ...@@ -95,9 +97,18 @@ static int b1pcmcia_add_card(struct capi_driver *driver,
b1_reset(card->port); b1_reset(card->port);
b1_getrevision(card); b1_getrevision(card);
cinfo->capi_ctrl.driver = driver; cinfo->capi_ctrl.driver = driver;
cinfo->capi_ctrl.driverdata = cinfo; cinfo->capi_ctrl.driverdata = cinfo;
cinfo->capi_ctrl.register_appl = b1_register_appl;
cinfo->capi_ctrl.release_appl = b1_release_appl;
cinfo->capi_ctrl.send_message = b1_send_message;
cinfo->capi_ctrl.load_firmware = b1_load_firmware;
cinfo->capi_ctrl.reset_ctr = b1_reset_ctr;
cinfo->capi_ctrl.procinfo = b1pcmcia_procinfo;
cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
strcpy(cinfo->capi_ctrl.name, card->name); strcpy(cinfo->capi_ctrl.name, card->name);
SET_MODULE_OWNER(&cinfo->capi_ctrl);
retval = attach_capi_ctr(&cinfo->capi_ctrl); retval = attach_capi_ctr(&cinfo->capi_ctrl);
if (retval) { if (retval) {
printk(KERN_ERR "%s: attach controller failed.\n", printk(KERN_ERR "%s: attach controller failed.\n",
...@@ -145,17 +156,8 @@ static char *b1pcmcia_procinfo(struct capi_ctr *ctrl) ...@@ -145,17 +156,8 @@ static char *b1pcmcia_procinfo(struct capi_ctr *ctrl)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static struct capi_driver b1pcmcia_driver = { static struct capi_driver b1pcmcia_driver = {
owner: THIS_MODULE,
name: "b1pcmcia", name: "b1pcmcia",
revision: "0.0", revision: "0.0",
load_firmware: b1_load_firmware,
reset_ctr: b1_reset_ctr,
register_appl: b1_register_appl,
release_appl: b1_release_appl,
send_message: b1_send_message,
procinfo: b1pcmcia_procinfo,
ctr_read_proc: b1ctl_read_proc,
}; };
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
......
...@@ -1163,9 +1163,18 @@ static int c4_add_card(struct capi_driver *driver, ...@@ -1163,9 +1163,18 @@ static int c4_add_card(struct capi_driver *driver,
for (i=0; i < nr_controllers ; i++) { for (i=0; i < nr_controllers ; i++) {
cinfo = &card->ctrlinfo[i]; cinfo = &card->ctrlinfo[i];
cinfo->capi_ctrl.driver = driver; cinfo->capi_ctrl.driver = driver;
cinfo->capi_ctrl.driverdata = cinfo; cinfo->capi_ctrl.driverdata = cinfo;
cinfo->capi_ctrl.register_appl = c4_register_appl;
cinfo->capi_ctrl.release_appl = c4_release_appl;
cinfo->capi_ctrl.send_message = c4_send_message;
cinfo->capi_ctrl.load_firmware = c4_load_firmware;
cinfo->capi_ctrl.reset_ctr = c4_reset_ctr;
cinfo->capi_ctrl.procinfo = c4_procinfo;
cinfo->capi_ctrl.ctr_read_proc = c4_read_proc;
strcpy(cinfo->capi_ctrl.name, card->name); strcpy(cinfo->capi_ctrl.name, card->name);
SET_MODULE_OWNER(&cinfo->capi_ctrl);
retval = attach_capi_ctr(&cinfo->capi_ctrl); retval = attach_capi_ctr(&cinfo->capi_ctrl);
if (retval) { if (retval) {
printk(KERN_ERR "%s: attach controller failed (%d).\n", printk(KERN_ERR "%s: attach controller failed (%d).\n",
...@@ -1203,31 +1212,13 @@ static int c4_add_card(struct capi_driver *driver, ...@@ -1203,31 +1212,13 @@ static int c4_add_card(struct capi_driver *driver,
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static struct capi_driver c2_driver = { static struct capi_driver c2_driver = {
owner: THIS_MODULE,
name: "c2", name: "c2",
revision: "0.0", revision: "0.0",
load_firmware: c4_load_firmware,
reset_ctr: c4_reset_ctr,
register_appl: c4_register_appl,
release_appl: c4_release_appl,
send_message: c4_send_message,
procinfo: c4_procinfo,
ctr_read_proc: c4_read_proc,
}; };
static struct capi_driver c4_driver = { static struct capi_driver c4_driver = {
owner: THIS_MODULE,
name: "c4", name: "c4",
revision: "0.0", revision: "0.0",
load_firmware: c4_load_firmware,
reset_ctr: c4_reset_ctr,
register_appl: c4_register_appl,
release_appl: c4_release_appl,
send_message: c4_send_message,
procinfo: c4_procinfo,
ctr_read_proc: c4_read_proc,
}; };
static int __devinit c4_probe(struct pci_dev *dev, static int __devinit c4_probe(struct pci_dev *dev,
......
...@@ -345,6 +345,9 @@ static void t1isa_remove(struct pci_dev *pdev) ...@@ -345,6 +345,9 @@ static void t1isa_remove(struct pci_dev *pdev)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static u16 t1isa_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
static char *t1isa_procinfo(struct capi_ctr *ctrl);
static int __init t1isa_probe(struct pci_dev *pdev, int cardnr) static int __init t1isa_probe(struct pci_dev *pdev, int cardnr)
{ {
avmctrl_info *cinfo; avmctrl_info *cinfo;
...@@ -400,9 +403,18 @@ static int __init t1isa_probe(struct pci_dev *pdev, int cardnr) ...@@ -400,9 +403,18 @@ static int __init t1isa_probe(struct pci_dev *pdev, int cardnr)
t1_disable_irq(card->port); t1_disable_irq(card->port);
b1_reset(card->port); b1_reset(card->port);
cinfo->capi_ctrl.driver = &t1isa_driver; cinfo->capi_ctrl.driver = &t1isa_driver;
cinfo->capi_ctrl.driverdata = cinfo; cinfo->capi_ctrl.driverdata = cinfo;
cinfo->capi_ctrl.register_appl = b1_register_appl;
cinfo->capi_ctrl.release_appl = b1_release_appl;
cinfo->capi_ctrl.send_message = t1isa_send_message;
cinfo->capi_ctrl.load_firmware = t1isa_load_firmware;
cinfo->capi_ctrl.reset_ctr = t1isa_reset_ctr;
cinfo->capi_ctrl.procinfo = t1isa_procinfo;
cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc;
strcpy(cinfo->capi_ctrl.name, card->name); strcpy(cinfo->capi_ctrl.name, card->name);
SET_MODULE_OWNER(&cinfo->capi_ctrl);
retval = attach_capi_ctr(&cinfo->capi_ctrl); retval = attach_capi_ctr(&cinfo->capi_ctrl);
if (retval) { if (retval) {
printk(KERN_INFO "%s: attach controller failed.\n", printk(KERN_INFO "%s: attach controller failed.\n",
...@@ -488,17 +500,8 @@ static char *t1isa_procinfo(struct capi_ctr *ctrl) ...@@ -488,17 +500,8 @@ static char *t1isa_procinfo(struct capi_ctr *ctrl)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static struct capi_driver t1isa_driver = { static struct capi_driver t1isa_driver = {
owner: THIS_MODULE,
name: "t1isa", name: "t1isa",
revision: "0.0", revision: "0.0",
load_firmware: t1isa_load_firmware,
reset_ctr: t1isa_reset_ctr,
register_appl: b1_register_appl,
release_appl: b1_release_appl,
send_message: t1isa_send_message,
procinfo: t1isa_procinfo,
ctr_read_proc: b1ctl_read_proc,
}; };
#define MAX_CARDS 4 #define MAX_CARDS 4
......
...@@ -45,6 +45,8 @@ MODULE_LICENSE("GPL"); ...@@ -45,6 +45,8 @@ MODULE_LICENSE("GPL");
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static char *t1pci_procinfo(struct capi_ctr *ctrl);
static int t1pci_add_card(struct capi_driver *driver, static int t1pci_add_card(struct capi_driver *driver,
struct capicardparams *p, struct capicardparams *p,
struct pci_dev *pdev) struct pci_dev *pdev)
...@@ -113,9 +115,18 @@ static int t1pci_add_card(struct capi_driver *driver, ...@@ -113,9 +115,18 @@ static int t1pci_add_card(struct capi_driver *driver,
goto err_unmap; goto err_unmap;
} }
cinfo->capi_ctrl.driver = driver; cinfo->capi_ctrl.driver = driver;
cinfo->capi_ctrl.driverdata = cinfo; cinfo->capi_ctrl.driverdata = cinfo;
cinfo->capi_ctrl.register_appl = b1dma_register_appl;
cinfo->capi_ctrl.release_appl = b1dma_release_appl;
cinfo->capi_ctrl.send_message = b1dma_send_message;
cinfo->capi_ctrl.load_firmware = b1dma_load_firmware;
cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr;
cinfo->capi_ctrl.procinfo = t1pci_procinfo;
cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc;
strcpy(cinfo->capi_ctrl.name, card->name); strcpy(cinfo->capi_ctrl.name, card->name);
SET_MODULE_OWNER(&cinfo->capi_ctrl);
retval = attach_capi_ctr(&cinfo->capi_ctrl); retval = attach_capi_ctr(&cinfo->capi_ctrl);
if (retval) { if (retval) {
printk(KERN_ERR "%s: attach controller failed.\n", driver->name); printk(KERN_ERR "%s: attach controller failed.\n", driver->name);
...@@ -183,17 +194,8 @@ static char *t1pci_procinfo(struct capi_ctr *ctrl) ...@@ -183,17 +194,8 @@ static char *t1pci_procinfo(struct capi_ctr *ctrl)
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static struct capi_driver t1pci_driver = { static struct capi_driver t1pci_driver = {
owner: THIS_MODULE,
name: "t1pci", name: "t1pci",
revision: "0.0", revision: "0.0",
load_firmware: b1dma_load_firmware,
reset_ctr: b1dma_reset_ctr,
register_appl: b1dma_register_appl,
release_appl: b1dma_release_appl,
send_message: b1dma_send_message,
procinfo: t1pci_procinfo,
ctr_read_proc: b1dmactl_read_proc,
}; };
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment