Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39302175 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6/:
  [PATCH] pcmcia: fix deadlock in pcmcia_parse_events
  [PATCH] com20020_cs: more device support
  [PATCH] au1xxx: pcmcia: fix __init called from non-init
  [PATCH] kill open-coded offsetof in cm4000_cs.c ZERO_DEV()
  [PATCH] pcmcia: convert pcmcia_cs to kthread
  [PATCH] pcmcia: fix kernel-doc function name
  [PATCH] pcmcia: hostap_cs.c - 0xc00f,0x0000 conflicts with pcnet_cs
  [PATCH] pcmcia: at91_cf suspend/resume/wakeup
  [PATCH] pcmcia: Make ide_cs work with the memory space of CF-Cards if IO space is not available
  [PATCH] pcmcia: TI PCIxx12 CardBus controller support
  [PATCH] pcmcia: warn if driver requests exclusive, but gets a shared IRQ
  [PATCH] pcmcia: expose tool in pcmcia/Documentation/pcmcia/
  [PATCH] pcmcia: another ID for serial_cs.c
  [PATCH] yenta: fix hidden PCI bus numbers
  [PATCH] yenta: do power-up only after socket is configured
parents 1cfef5ed 4b7a89a3
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
/* crc32hash.c - derived from linux/lib/crc32.c, GNU GPL v2 */
/* Usage example:
$ ./crc32hash "Dual Speed"
*/

#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

unsigned int crc32(unsigned char const *p, unsigned int len)
{
	int i;
	unsigned int crc = 0;
	while (len--) {
		crc ^= *p++;
		for (i = 0; i < 8; i++)
			crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
	}
	return crc;
}

int main(int argc, char **argv) {
	unsigned int result;
	if (argc != 2) {
		printf("no string passed as argument\n");
		return -1;
	}
	result = crc32(argv[1], strlen(argv[1]));
	printf("0x%x\n", result);
	return 0;
}
+3 −33
Original line number Diff line number Diff line
@@ -27,37 +27,7 @@ pcmcia:m0149cC1ABf06pfn00fn00pa725B842DpbF1EFEE84pc0877B627pd00000000
The hex value after "pa" is the hash of product ID string 1, after "pb" for
string 2 and so on.

Alternatively, you can use this small tool to determine the crc32 hash.
simply pass the string you want to evaluate as argument to this program,
e.g.
Alternatively, you can use crc32hash (see Documentation/pcmcia/crc32hash.c)
to determine the crc32 hash.  Simply pass the string you want to evaluate
as argument to this program, e.g.:
$ ./crc32hash "Dual Speed"

-------------------------------------------------------------------------
/* crc32hash.c - derived from linux/lib/crc32.c, GNU GPL v2 */
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

unsigned int crc32(unsigned char const *p, unsigned int len)
{
	int i;
	unsigned int crc = 0;
	while (len--) {
		crc ^= *p++;
		for (i = 0; i < 8; i++)
			crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
	}
	return crc;
}

int main(int argc, char **argv) {
	unsigned int result;
	if (argc != 2) {
		printf("no string passed as argument\n");
		return -1;
	}
	result = crc32(argv[1], strlen(argv[1]));
	printf("0x%x\n", result);
	return 0;
}
+1 −6
Original line number Diff line number Diff line
@@ -149,12 +149,7 @@ struct cm4000_dev {
#define	ZERO_DEV(dev)  						\
	memset(&dev->atr_csum,0,				\
		sizeof(struct cm4000_dev) - 			\
		/*link*/ sizeof(struct pcmcia_device *) - 	\
		/*node*/ sizeof(dev_node_t) - 			\
		/*atr*/ MAX_ATR*sizeof(char) - 			\
		/*rbuf*/ 512*sizeof(char) - 			\
		/*sbuf*/ 512*sizeof(char) - 			\
		/*queue*/ 4*sizeof(wait_queue_head_t))
		offsetof(struct cm4000_dev, atr_csum))

static struct pcmcia_device *dev_table[CM4000_MAX_DEV];
static struct class *cmm_class;
+71 −10
Original line number Diff line number Diff line
@@ -146,7 +146,16 @@ static void ide_detach(struct pcmcia_device *link)
    kfree(link->priv);
} /* ide_detach */

static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle)
static void idecs_mmio_fixup(ide_hwif_t *hwif)
{
	default_hwif_mmiops(hwif);
	hwif->mmio = 2;

	ide_undecoded_slave(hwif);
}

static int idecs_register(unsigned long io, unsigned long ctl,
	unsigned long irq, struct pcmcia_device *handle, int is_mmio)
{
    hw_regs_t hw;
    memset(&hw, 0, sizeof(hw));
@@ -154,9 +163,21 @@ static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq
    hw.irq = irq;
    hw.chipset = ide_pci;
    hw.dev = &handle->dev;

    if(is_mmio)
    	return ide_register_hw_with_fixup(&hw, NULL, idecs_mmio_fixup);
    else
        return ide_register_hw_with_fixup(&hw, NULL, ide_undecoded_slave);
}

void outb_io(unsigned char value, unsigned long port) {
	outb(value, port);
}

void outb_mem(unsigned char value, unsigned long port) {
	writeb(value, (void __iomem *) port);
}

/*======================================================================

    ide_config() is scheduled to run after a CARD_INSERTION event
@@ -180,7 +201,8 @@ static int ide_config(struct pcmcia_device *link)
    } *stk = NULL;
    cistpl_cftable_entry_t *cfg;
    int i, pass, last_ret = 0, last_fn = 0, hd, is_kme = 0;
    unsigned long io_base, ctl_base;
    unsigned long io_base, ctl_base, is_mmio, try_slave;
    void (*my_outb)(unsigned char, unsigned long);

    DEBUG(0, "ide_config(0x%p)\n", link);

@@ -210,7 +232,7 @@ static int ide_config(struct pcmcia_device *link)
    /* Not sure if this is right... look up the current Vcc */
    CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &stk->conf));

    pass = io_base = ctl_base = 0;
    pass = io_base = ctl_base = is_mmio = try_slave = 0;
    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
    tuple.Attributes = 0;
    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
@@ -258,11 +280,45 @@ static int ide_config(struct pcmcia_device *link)
			goto next_entry;
		io_base = link->io.BasePort1;
		ctl_base = link->io.BasePort1 + 0x0e;

		if (io->win[0].len >= 0x20)
			try_slave = 1;

	    } else goto next_entry;
	    /* If we've got this far, we're done */
	    break;
	}

	if ((cfg->mem.nwin > 0) || (stk->dflt.mem.nwin > 0)) {
	    win_req_t req;
	    memreq_t map;
	    cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &stk->dflt.mem;

	    if (mem->win[0].len < 16)
	    	goto next_entry;

	    req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
	    req.Attributes |= WIN_ENABLE;
	    req.Base = mem->win[0].host_addr;
	    req.Size = 0;

	    req.AccessSpeed = 0;
	    if (pcmcia_request_window(&link, &req, &link->win) != 0)
		goto next_entry;
	    map.Page = 0; map.CardOffset = mem->win[0].card_addr;
	    if (pcmcia_map_mem_page(link->win, &map) != 0)
		goto next_entry;

      	    io_base = (unsigned long) ioremap(req.Base, req.Size);
    	    ctl_base = io_base + 0x0e;
    	    is_mmio = 1;

    	    if (mem->win[0].len >= 0x20)
    	    	try_slave = 1;

	    break;
	}

    next_entry:
	if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
	    memcpy(&stk->dflt, cfg, sizeof(stk->dflt));
@@ -278,21 +334,26 @@ static int ide_config(struct pcmcia_device *link)
    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));

    if(is_mmio)
    	my_outb = outb_mem;
    else
    	my_outb = outb_io;

    /* disable drive interrupts during IDE probe */
    outb(0x02, ctl_base);
    my_outb(0x02, ctl_base);

    /* special setup for KXLC005 card */
    if (is_kme)
	outb(0x81, ctl_base+1);
	my_outb(0x81, ctl_base+1);

    /* retry registration in case device is still spinning up */
    for (hd = -1, i = 0; i < 10; i++) {
	hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link);
	hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link, is_mmio);
	if (hd >= 0) break;
	if (link->io.NumPorts1 == 0x20) {
	    outb(0x02, ctl_base + 0x10);
	if (try_slave) {
	    my_outb(0x02, ctl_base + 0x10);
	    hd = idecs_register(io_base + 0x10, ctl_base + 0x10,
				link->irq.AssignedIRQ, link);
				link->irq.AssignedIRQ, link, is_mmio);
	    if (hd >= 0) {
		io_base += 0x10;
		ctl_base += 0x10;
+4 −1
Original line number Diff line number Diff line
@@ -387,7 +387,10 @@ static int com20020_resume(struct pcmcia_device *link)
}

static struct pcmcia_device_id com20020_ids[] = {
	PCMCIA_DEVICE_PROD_ID12("Contemporary Control Systems, Inc.", "PCM20 Arcnet Adapter", 0x59991666, 0x95dfffaf),
	PCMCIA_DEVICE_PROD_ID12("Contemporary Control Systems, Inc.",
			"PCM20 Arcnet Adapter", 0x59991666, 0x95dfffaf),
	PCMCIA_DEVICE_PROD_ID12("SoHard AG",
			"SH ARC PCMCIA", 0xf8991729, 0x69dff0c7),
	PCMCIA_DEVICE_NULL
};
MODULE_DEVICE_TABLE(pcmcia, com20020_ids);
Loading