Newsgroup: it.comp.lang.c
Titolo: ldisc.write_wakeup

ldisc.write_wakeup)
        {
            tty->ldisc.write_wakeup(tty);
        }
        wake_up_interruptible(&tty->write_wait);
    }
}
c:843: error: request for member ‘write_wakeup’ in something not a
structure or union
Sapete darmi una mano.

 structure or union
E' possibile che ldisc sia un membro puntatore, quindi devi usare
l'operatore ->
ttry->ldisc->write_wakeup
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

ma ldisc e` un puntatore ad una struttura o e` una struttura?
Se ci fai vedere la definizione tty_struct dovremmo capirlo al volo.

 Se ci fai vedere la definizione tty_struct dovremmo capirlo al volo.
struct tty_ldisc {
	struct tty_ldisc_ops *ops;
	atomic_t users;
};
#define TTY_LDISC_MAGIC	0x5403
#define LDISC_FLAG_DEFINED	0x00000001
#define MODULE_ALIAS_LDISC(ldisc) \
	MODULE_ALIAS("tty-ldisc-" __stringify(ldisc))
#endif /* _LINUX_TTY_LDISC_H */

Questa � la definizione di tty_ldisc. Non dice niente. Serve vedere la
definizione della struttura che contiene il membro ldisc.


luca72 ha scritto:

no ma e` tty_struct che serve, per capire se ldisc e` un pointer o no,
come diceva Andrea


static struct tty_struct			*golden_tty[GOLDEN_UART_TOTAL_MAX + 1];
Grazie
Luca

Luca, questa � la dichiarazione di un array di puntatori alla struttura
tty_struct. Facci vedere la struttura tty_struct !



Visto che mi sembra il kernel linux, dò i miei 2 cents:
secondo me devi includere "include/linux/tty_ldisc.h" - per qualche
motivo non viene trovato nelle dipendenze
(tty_ldisc nella tty_struct non è un puntatore)
Ciao!


Ah, e ovviamente write_wakeup sarebbe un membro di ops, non di ldisc -
quindi non:
tty->ldisc.write_wakeup(tty);
ma
tty->ldisc.ops->write_wakeup(tty);
Ciao!

port, port);
    }
	down(&port_sem);
    golden_unconfigure_port(drv, state);
    state->port = NULL;
	up(&port_sem);
    return 0;
}
static void golden_unregister_ports(struct snx_driver *drv)
{
    int i;
    for (i = 0; i < GOLDEN_UART_TOTAL_MAX + 1; i++)
    {
        struct golden_port *up = &golden_port_table[i];
        if (up->port.iobase)
        {
            golden_remove_one_port(drv, &up->port);
        }
    }
}
static void golden_pci_board_release_irq(void)
{
    struct golden_board *mb = NULL;
    struct golden_port *up = NULL;
    int i;
    for (i = 0; i < GOLDEN_PCI_BOARDS_MAX; i++)
    {
        mb = &golden_board_table[i];
        if (mb->board_enum > 0)
        {
            up = &golden_port_table[mb->port_index];
            if (mb->irq > 0)
            {
                free_irq(mb->irq, up);
            }
        }
    }
}
static int __init snx_golden_init(void)
{
	int status = 0;
	printk("\n\n");
	printk("====================  GOLDEN Series Driver Module Install
=====================\n");
	printk("\n");
	printk("GOLDEN Info : Loading Golden Series Board Driver Module\n");
	printk("                                                       --
Version: %s\n",DRIVER_VERSION);
	status = golden_register_driver(&golden_reg);
	if (status != 0)
	{
		goto step1_fail;
	}
	status = golden_pci_board_probe();
	if (status != 0)
	{
		goto step2_fail;
	}
	status = golden_get_pci_board_conf();
	if (status != 0)
	{
		goto step2_fail;
	}
	status = golden_board_init();
	if (status != 0)
	{
		goto step3_fail;
	}
    status = golden_register_ports(&golden_reg);
    if (status != 0)
    {
        goto step4_fail;
    }
	printk
("================================================================================
\n");
	return status;
step4_fail:
    golden_unregister_ports(&golden_reg);
step3_fail:
	golden_pci_board_release_irq();
step2_fail:
    golden_unregister_driver(&golden_reg);
step1_fail:
	printk("GOLDEN Error: Couldn't Loading Golden Series Board Driver
Module correctly\n");
	printk("              , please reboot system and try again, if error
still happen\n");
	printk("              , contact support.\n\n");
	printk
("================================================================================
\n");
	return status;
}
static void __exit snx_golden_exit(void)
{
	printk("\n\n");
	printk("===================  GOLDEN Series Driver Module Uninstall
====================\n");
	printk("\n");
	golden_unregister_ports(&golden_reg);
    golden_pci_board_release_irq();
	golden_unregister_driver(&golden_reg);
	printk("GOLDEN Info : Unload Golden Series Board Driver Module Done.
\n");
	printk
("================================================================================
\n");
}
module_init(snx_golden_init);
module_exit(snx_golden_exit);

 Sapete darmi una mano.
write_wakeup ï¿½ un puntatore a una call back che ï¿½
membro della strutura ldisk, quindi se non risolve
la chiamata, o non includi il file tty_ldisk.h o
la versione che trova non ï¿½ congruente con il driver.
la struttura che ti interessa ï¿½ questa:
http://www.techq.com/source/code/Linux/1.2.13/include/linux/tty_ldisc.h
Per info sui driver seriali, vedi qua:
http://www.linux.it/~rubini/docs/serial/serial.html
Bye
B.