lkml.org 
[lkml]   [2008]   [Jan]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] drivers/char/moxa.c, kernel 2.6.23.14
    On 01/20/2008 10:45 PM, Øyvind Aabling wrote:
    > moxa.c changes to MOXA_GET_CONF ioctl breaks moxaload (userspace
    > application for firmware download to MOXA Intellio CPU boards).
    >
    > Attached (and included inline below) is a patch to solve a problem
    > introduced by changes to struct moxa_board_conf in drivers/char/moxa.c.
    >
    > AFAICS from the changelogs, moxa.c was rewritten to a new API in 2.6.21,
    > but I've only tested it (and moxaload) on kernels up to 2.6.19.2
    > (where it works) and on 2.6.22.6 and various later kernels,
    > including the latest (2.6.23.14), where it doesn't work.
    >
    > Steps to reproduce:
    >
    > Call the moxaload program (from MOXA) to download the firmware.

    Thanks for pointing this out.

    > moxaload will fail on most systems (all the ones I've tried), because it
    > thinks there is a memory conflict, although this behaviour will depend
    > on the exact contents of struct moxa_board_conf (in drivers/char/moxa.c).
    >
    > The problem is, that moxaload uses the MOXA_GET_CONF ioctl,
    > which returns (verbatim) the contents of struct moxa_board_conf,
    > the structure (and contents) of which has changed heavily.
    >
    > This patch corrects this problem by reverting the behaviour of the
    > MOXA_GET_CONF ioctl, so it returns the info that moxaload expects.
    >
    > I'm not on the kernel list, so please CC:
    > me with any questions and/or comments.
    >
    > To Jiri Slaby <jirislaby@gmail.com>:
    >
    > I've CC'ed this to you, although linux/MAINTAINERS doesn't
    > mention you as the maintainer of moxa.c, since the changelogs
    > seems to indicate, that you're the current maintainer.
    >
    > linux/MAINTAINERS mentions you (Jiri) as the maintainer
    > of mxser, but that is the driver for other MOXA
    > boards, so I hope that I've guessed right ...

    Yeah, at least I know what's the problem about :).

    > --- linux-2.6.23.14/drivers/char/moxa.c 2008-01-14 21:49:56.000000000
    > +0100
    > +++ linux/drivers/char/moxa.c 2008-01-20 18:30:15.000000000 +0100
    > @@ -109,6 +109,8 @@
    > int busType;
    >
    > int loadstat;
    > + unsigned short busNum;
    > + unsigned short devNum;
    >
    > void __iomem *basemem;
    > void __iomem *intNdx;
    > @@ -116,6 +118,16 @@
    > void __iomem *intTable;
    > } moxa_boards[MAX_BOARDS];
    >
    > +/* Used by userspace application moxaload (firmware download) */
    > +static struct moxa_board_info {
    > + int boardType;
    > + int numPorts;
    > + unsigned long baseAddr;
    > + int busType;
    > + unsigned short busNum;
    > + unsigned short devNum;
    > +} moxa_board_info[MAX_BOARDS];
    > +

    Hrm, too ugly (sadly as same as it was).

    - not 32/64 bit compatible due to the ulong there.
    - not exported to the world via include/linux (the reason why I removed it, they
    use something, which they know nothing about).
    - I would rather see true firmware loading.

    Would you be willing to test such a patch for point no. 3?

    > struct mxser_mstatus {
    > tcflag_t cflag;
    > int cts;
    > @@ -304,6 +316,9 @@
    > goto err;
    >
    > board->boardType = board_type;
    > + board->baseAddr = pci_resource_start(pdev, 2);

    you missed isa cards...

    > + board->busNum = pdev->bus->number;
    > + board->devNum = PCI_SLOT(pdev->devfn);
    > switch (board_type) {
    > case MOXA_BOARD_C218_ISA:
    > case MOXA_BOARD_C218_PCI:
    > @@ -1494,8 +1509,16 @@
    > }
    > switch (cmd) {
    > case MOXA_GET_CONF:
    > - if(copy_to_user(argp, &moxa_boards, MAX_BOARDS *
    > - sizeof(struct moxa_board_conf)))
    > + for (i = 0; i < MAX_BOARDS; i++) {
    > + moxa_board_info[i].boardType = moxa_boards[i].boardType;
    > + moxa_board_info[i].numPorts = moxa_boards[i].numPorts;
    > + moxa_board_info[i].baseAddr = moxa_boards[i].baseAddr;
    > + moxa_board_info[i].busType = moxa_boards[i].busType;
    > + moxa_board_info[i].busNum = moxa_boards[i].busNum;
    > + moxa_board_info[i].devNum = moxa_boards[i].devNum;
    > + }
    > + if(copy_to_user(argp, &moxa_board_info, MAX_BOARDS *
    > + sizeof(struct moxa_board_info)))
    > return -EFAULT;
    > return (0);
    > case MOXA_INIT_DRIVER:

    thanks,
    --js
    --
    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: 2008-01-21 23:55    [W:0.037 / U:28.816 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site