lkml.org 
[lkml]   [2004]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[2.6 patch] mxser.c: fix inlines
    Trying to compile drivers/char/mxser.c with gcc 3.4 and
    # define inline __inline__ __attribute__((always_inline))
    results in the following compile error:

    <-- snip -->

    ...
    CC drivers/char/mxser.o
    drivers/char/mxser.c: In function `mxser_interrupt':
    drivers/char/mxser.c:352: sorry, unimplemented: inlining failed in call
    to 'mxser_receive_chars': function body not available
    drivers/char/mxser.c:1347: sorry, unimplemented: called from here
    drivers/char/mxser.c:354: sorry, unimplemented: inlining failed in call
    to 'mxser_check_modem_status': function body not available
    drivers/char/mxser.c:1350: sorry, unimplemented: called from here
    drivers/char/mxser.c:353: sorry, unimplemented: inlining failed in call
    to 'mxser_transmit_chars': function body not available
    drivers/char/mxser.c:1355: sorry, unimplemented: called from here
    make[2]: *** [drivers/char/mxser.o] Error 1

    <-- snip -->


    The patch below moves mxser_interrupt below the inline functions it
    uses.


    An alternative approach would be to remove the inlines.


    diffstat output:
    drivers/char/mxser.c | 128 +++++++++++++++++++++----------------------
    1 files changed, 64 insertions(+), 64 deletions(-)


    Signed-off-by: Adrian Bunk <bunk@fs.tum.de>

    --- linux-2.6.7-mm7-full-gcc3.4/drivers/char/mxser.c.old 2004-07-13 02:12:23.000000000 +0200
    +++ linux-2.6.7-mm7-full-gcc3.4/drivers/char/mxser.c 2004-07-13 02:16:13.000000000 +0200
    @@ -348,10 +348,10 @@
    static void mxser_stop(struct tty_struct *);
    static void mxser_start(struct tty_struct *);
    static void mxser_hangup(struct tty_struct *);
    -static irqreturn_t mxser_interrupt(int, void *, struct pt_regs *);
    static inline void mxser_receive_chars(struct mxser_struct *, int *);
    static inline void mxser_transmit_chars(struct mxser_struct *);
    static inline void mxser_check_modem_status(struct mxser_struct *, int);
    +static irqreturn_t mxser_interrupt(int, void *, struct pt_regs *);
    static int mxser_block_til_ready(struct tty_struct *, struct file *, struct mxser_struct *);
    static int mxser_startup(struct mxser_struct *);
    static void mxser_shutdown(struct mxser_struct *);
    @@ -1302,69 +1302,6 @@
    wake_up_interruptible(&info->open_wait);
    }

    -/*
    - * This is the serial driver's generic interrupt routine
    - */
    -static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
    -{
    - int status, i;
    - struct mxser_struct *info;
    - struct mxser_struct *port;
    - int max, irqbits, bits, msr;
    - int pass_counter = 0;
    - int handled = 0;
    -
    - port = 0;
    - for (i = 0; i < MXSER_BOARDS; i++) {
    - if (dev_id == &(mxvar_table[i * MXSER_PORTS_PER_BOARD])) {
    - port = dev_id;
    - break;
    - }
    - }
    -
    - if (i == MXSER_BOARDS)
    - return IRQ_NONE;
    - if (port == 0)
    - return IRQ_NONE;
    - max = mxser_numports[mxsercfg[i].board_type];
    -
    - while (1) {
    - irqbits = inb(port->vector) & port->vectormask;
    - if (irqbits == port->vectormask)
    - break;
    - handled = 1;
    - for (i = 0, bits = 1; i < max; i++, irqbits |= bits, bits <<= 1) {
    - if (irqbits == port->vectormask)
    - break;
    - if (bits & irqbits)
    - continue;
    - info = port + i;
    - if (!info->tty ||
    - (inb(info->base + UART_IIR) & UART_IIR_NO_INT))
    - continue;
    - status = inb(info->base + UART_LSR) & info->read_status_mask;
    - if (status & UART_LSR_DR)
    - mxser_receive_chars(info, &status);
    - msr = inb(info->base + UART_MSR);
    - if (msr & UART_MSR_ANY_DELTA)
    - mxser_check_modem_status(info, msr);
    - if (status & UART_LSR_THRE) {
    -/* 8-2-99 by William
    - if ( info->x_char || (info->xmit_cnt > 0) )
    - */
    - mxser_transmit_chars(info);
    - }
    - }
    - if (pass_counter++ > MXSER_ISR_PASS_LIMIT) {
    -#if 0
    - printk("MOXA Smartio/Indusrtio family driver interrupt loop break\n");
    -#endif
    - break; /* Prevent infinite loops */
    - }
    - }
    - return IRQ_RETVAL(handled);
    -}
    -
    static inline void mxser_receive_chars(struct mxser_struct *info,
    int *status)
    {
    @@ -1485,6 +1422,69 @@
    }
    }

    +/*
    + * This is the serial driver's generic interrupt routine
    + */
    +static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
    +{
    + int status, i;
    + struct mxser_struct *info;
    + struct mxser_struct *port;
    + int max, irqbits, bits, msr;
    + int pass_counter = 0;
    + int handled = 0;
    +
    + port = 0;
    + for (i = 0; i < MXSER_BOARDS; i++) {
    + if (dev_id == &(mxvar_table[i * MXSER_PORTS_PER_BOARD])) {
    + port = dev_id;
    + break;
    + }
    + }
    +
    + if (i == MXSER_BOARDS)
    + return IRQ_NONE;
    + if (port == 0)
    + return IRQ_NONE;
    + max = mxser_numports[mxsercfg[i].board_type];
    +
    + while (1) {
    + irqbits = inb(port->vector) & port->vectormask;
    + if (irqbits == port->vectormask)
    + break;
    + handled = 1;
    + for (i = 0, bits = 1; i < max; i++, irqbits |= bits, bits <<= 1) {
    + if (irqbits == port->vectormask)
    + break;
    + if (bits & irqbits)
    + continue;
    + info = port + i;
    + if (!info->tty ||
    + (inb(info->base + UART_IIR) & UART_IIR_NO_INT))
    + continue;
    + status = inb(info->base + UART_LSR) & info->read_status_mask;
    + if (status & UART_LSR_DR)
    + mxser_receive_chars(info, &status);
    + msr = inb(info->base + UART_MSR);
    + if (msr & UART_MSR_ANY_DELTA)
    + mxser_check_modem_status(info, msr);
    + if (status & UART_LSR_THRE) {
    +/* 8-2-99 by William
    + if ( info->x_char || (info->xmit_cnt > 0) )
    + */
    + mxser_transmit_chars(info);
    + }
    + }
    + if (pass_counter++ > MXSER_ISR_PASS_LIMIT) {
    +#if 0
    + printk("MOXA Smartio/Indusrtio family driver interrupt loop break\n");
    +#endif
    + break; /* Prevent infinite loops */
    + }
    + }
    + return IRQ_RETVAL(handled);
    +}
    +
    static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp,
    struct mxser_struct *info)
    {
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:04    [W:0.028 / U:32.124 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site