This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TIWI-R2 packet loss with Wilink_driver under linux

Other Parts Discussed in Thread: DM3730, WL1271

Hello,

I'm using a TIWI-R2 module on a custom DM3730 board. The module is connected via SDIO using MM2 and powered by an external 1.8 and 3.3 V (not twl4030).
From a SW point of view, i'm using kernel 2.6.32 from OE and the "WiLink_Driver_6.1.0.1.149", FW: "Rev 6.1.0.1.349", from the TI wireless demo 3 package.
I'm using the FXP73 Blue Diamond 2.4GHz Antenna. The module is calibrated. The board passed EMC ETSI certification process.
No problem in scan and AP association, with iperf I got 23 Mbit of UDP traffic without errors, using standard packet size (1400 byte).

This is the issue: in my videotelephony apps, based on RTP (UDP) protocol (1.5 Mbps), I got packet loss. The issue seems to be related to small UDP packet
(less than 300byte). If I force iperf to work with this kind of packet, I got errors and the tiwlan_drv CPU load is very high.

Any suggestions?
Best Regards,

 

Giordano

  • Hello Giodano,

    Have you tried upgrading the SDK to v5.03?
    http://processors.wiki.ti.com/index.php/AM37x_release_download_page


    Regards,
    Nir


     

  • Hi Giordano,

    Intersting. Your module seems calibrated since you are able to get to such high TP.

    Regarding the CPU load, it's very hard to separate the video-telephony application load (Compression video) and the TP the Wifi module takes. But For 1.5Mb, the Wifi module doesn't take so much CPU load.

    Are you able to capture WLAN sniffer? Were you able to see if the UDP 300 bytes packets were broadcast in the AIR? What AP are you working with? Can you please change (via wlan_cu) the PS to Active and check again.

    Does the packets are RX or TX that get losts?

    Thanks,

    Elad.


  • Hi Nir,

    just a clarification: the new SDK is made for fornel 2.6.37, is it correct?

    The customer can't move from the actual 2.6.32 because they just qualified, valudated and certificated the code into DSP, so there are some troubble for they to move into new kernel.

    Do you know if there are some guide that helps the backport of the driver into 2.6.32 kernel?

     

    BR,

     

    Giordano

  • /*
     * linux/arch/arm/mach-omap2/board-omap3beagle.c
     *
     * Copyright (C) 2008 Texas Instruments
     *
     * Modified from mach-omap2/board-3430sdp.c
     *
     * Initial code: Syed Mohammed Khasim
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License version 2 as
     * published by the Free Software Foundation.
     */
    
    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/platform_device.h>
    #include <linux/delay.h>
    #include <linux/err.h>
    #include <linux/clk.h>
    #include <linux/io.h>
    #include <linux/leds.h>
    #include <linux/gpio.h>
    #include <linux/input.h>
    #include <linux/gpio_keys.h>
    
    #include <linux/mtd/mtd.h>
    #include <linux/mtd/partitions.h>
    #include <linux/mtd/nand.h>
    #include <linux/mmc/host.h>
    
    #include <linux/regulator/machine.h>
    #include <linux/regulator/fixed.h>
    #include <linux/i2c/twl.h>
    
    #include <mach/hardware.h>
    #include <asm/mach-types.h>
    #include <asm/mach/arch.h>
    #include <asm/mach/map.h>
    #include <asm/mach/flash.h>
    
    #include <plat/board.h>
    #include <plat/common.h>
    #include <plat/display.h>
    #include <plat/gpmc.h>
    #include <plat/nand.h>
    #include <plat/usb.h>
    
    #include "mux.h"
    #include "hsmmc.h"
    #include "timer-gp.h"
    
    #include <linux/wl12xx.h>
    
    #define NAND_BLOCK_SIZE		SZ_128K
    
    /*
     * OMAP3 Beagle revision
     * Run time detection of Beagle revision is done by reading GPIO.
     * GPIO ID -
     *     AXBX    = GPIO173, GPIO172, GPIO171: 1 1 1
     *     C1_3    = GPIO173, GPIO172, GPIO171: 1 1 0
     *     C4      = GPIO173, GPIO172, GPIO171: 1 0 1
     *     XMA     = GPIO173, GPIO172, GPIO171: 0 0 0
     *     XMB     = GPIO173, GPIO172, GPIO171: 0 0 1
     *     XMC     = GPIO173, GPIO172, GPIO171: 0 1 0
     */
    enum {
           OMAP3BEAGLE_BOARD_UNKN = 0,
           OMAP3BEAGLE_BOARD_AXBX,
           OMAP3BEAGLE_BOARD_C1_3,
           OMAP3BEAGLE_BOARD_C4,
           OMAP3BEAGLE_BOARD_XMAB,
           OMAP3BEAGLE_BOARD_XMC,
    };
    
    static u8 omap3_beagle_version;
    
    static u8 omap3_beagle_get_rev(void)
    {
    	return omap3_beagle_version;
    }
    
    static void __init omap3_beagle_init_rev(void)
    {
    	int ret;
    	u16 beagle_rev = 0;
    
    	omap_mux_init_gpio(171, OMAP_PIN_INPUT_PULLUP);
    	omap_mux_init_gpio(172, OMAP_PIN_INPUT_PULLUP);
    	omap_mux_init_gpio(173, OMAP_PIN_INPUT_PULLUP);
    
    	ret = gpio_request(171, "rev_id_0");
    	if (ret < 0)
    		goto fail0;
    
    	ret = gpio_request(172, "rev_id_1");
    	if (ret < 0)
    		goto fail1;
    
    	ret = gpio_request(173, "rev_id_2");
    	if (ret < 0)
    		goto fail2;
    
    	gpio_direction_input(171);
    	gpio_direction_input(172);
    	gpio_direction_input(173);
    
    	beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1)
    			| (gpio_get_value(173) << 2);
    
           switch (beagle_rev) {
           case 7:
                   printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n");
                   omap3_beagle_version = OMAP3BEAGLE_BOARD_AXBX;
                   break;
           case 6:
                   printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");
                   omap3_beagle_version = OMAP3BEAGLE_BOARD_C1_3;
                   break;
           case 5:
                   printk(KERN_INFO "OMAP3 Beagle Rev: C4\n");
                   omap3_beagle_version = OMAP3BEAGLE_BOARD_C4;
                   break;
           case 0:
                   printk(KERN_INFO "OMAP3 Beagle Rev: xM A\n");
                   omap3_beagle_version = OMAP3BEAGLE_BOARD_XMAB;
                   break;
           case 1:
                   printk(KERN_INFO "OMAP3 Beagle Rev: xM B\n");
                   omap3_beagle_version = OMAP3BEAGLE_BOARD_XMAB;
                   break;
           case 2:
                   printk(KERN_INFO "OMAP3 Beagle Rev: xM C\n");
                   omap3_beagle_version = OMAP3BEAGLE_BOARD_XMC;
                   break;
           default:
                   printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd, "
                           "assuming xM C or newer\n", beagle_rev);
                   omap3_beagle_version = OMAP3BEAGLE_BOARD_XMC;
           }
    
    	return;
    
    fail2:
    	gpio_free(172);
    fail1:
    	gpio_free(171);
    fail0:
    	printk(KERN_ERR "Unable to get revision detection GPIO pins\n");
    	omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;
    
    	return;
    }
    
    static struct mtd_partition omap3beagle_nand_partitions[] = {
    	/* All the partition sizes are listed in terms of NAND block size */
    	{
    		.name		= "X-Loader",
    		.offset		= 0,
    		.size		= 4 * NAND_BLOCK_SIZE,
    		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
    	},
    	{
    		.name		= "U-Boot",
    		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x80000 */
    		.size		= 15 * NAND_BLOCK_SIZE,
    		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
    	},
    	{
    		.name		= "U-Boot Env",
    		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x260000 */
    		.size		= 1 * NAND_BLOCK_SIZE,
    	},
    	{
    		.name		= "Kernel",
    		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x280000 */
    		.size		= 32 * NAND_BLOCK_SIZE,
    	},
    	{
    		.name		= "File System",
    		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x680000 */
    		.size		= MTDPART_SIZ_FULL,
    	},
    };
    
    static struct omap_nand_platform_data omap3beagle_nand_data = {
    	.options	= NAND_BUSWIDTH_16,
    	.parts		= omap3beagle_nand_partitions,
    	.nr_parts	= ARRAY_SIZE(omap3beagle_nand_partitions),
    	.dma_channel	= -1,		/* disable DMA in OMAP NAND driver */
    	.nand_setup	= NULL,
    	.dev_ready	= NULL,
    };
    
    /* DSS */
    
    static int beagle_enable_dvi(struct omap_dss_device *dssdev)
    {
    	if (gpio_is_valid(dssdev->reset_gpio))
    		gpio_set_value(dssdev->reset_gpio, 1);
    
    	return 0;
    }
    
    static void beagle_disable_dvi(struct omap_dss_device *dssdev)
    {
    	if (gpio_is_valid(dssdev->reset_gpio))
    		gpio_set_value(dssdev->reset_gpio, 0);
    }
    
    static struct omap_dss_device beagle_dvi_device = {
    	.type = OMAP_DISPLAY_TYPE_DPI,
    	.name = "dvi",
    	.driver_name = "generic_panel",
    	.phy.dpi.data_lines = 24,
    	.reset_gpio = -EINVAL,
    	.platform_enable = beagle_enable_dvi,
    	.platform_disable = beagle_disable_dvi,
    };
    
    static struct omap_dss_device beagle_tv_device = {
    	.name = "tv",
    	.driver_name = "venc",
    	.type = OMAP_DISPLAY_TYPE_VENC,
    	.phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
    };
    
    static struct omap_dss_device *beagle_dss_devices[] = {
    	&beagle_dvi_device,
    	&beagle_tv_device,
    };
    
    static struct omap_dss_board_info beagle_dss_data = {
    	.num_devices = ARRAY_SIZE(beagle_dss_devices),
    	.devices = beagle_dss_devices,
    	.default_device = &beagle_dvi_device,
    };
    
    static struct platform_device beagle_dss_device = {
    	.name          = "omapdss",
    	.id            = -1,
    	.dev            = {
    		.platform_data = &beagle_dss_data,
    	},
    };
    
    static struct regulator_consumer_supply beagle_vdac_supply =
    	REGULATOR_SUPPLY("vdda_dac", "omapdss");
    
    static struct regulator_consumer_supply beagle_vdvi_supply =
    	REGULATOR_SUPPLY("vdds_dsi", "omapdss");
    
    static void __init beagle_display_init(void)
    {
    	int r;
    
    	r = gpio_request(beagle_dvi_device.reset_gpio, "DVI reset");
    	if (r < 0) {
    		printk(KERN_ERR "Unable to get DVI reset GPIO\n");
    		return;
    	}
    
    	gpio_direction_output(beagle_dvi_device.reset_gpio, 0);
    }
    
    #include "sdram-micron-mt46h32m32lf-6.h"
    
    //#if defined(CONFIG_WL1271) || defined(CONFIG_WL1271_MODULE)
    #if 1
    static struct regulator_consumer_supply tablet_vmmc2_supply =
        REGULATOR_SUPPLY("vmmc", "mmci-omap-hs.1");
    
    static struct regulator_init_data tablet_vmmc2 = {
            .constraints = {
                    .valid_ops_mask = REGULATOR_CHANGE_STATUS,
            },
            .num_consumer_supplies  = 1,
            .consumer_supplies = &tablet_vmmc2_supply,
    };
    
    static struct fixed_voltage_config tablet_wl1271 = {
            .supply_name            = "vwl1271",
            .microvolts             = 1800000, /* 1.8V */
            .gpio                   = 174,
            .startup_delay          = 70000, /* 70msec */
            .enable_high            = 1,
            .enabled_at_boot        = 0,
            .init_data              = NULL,//&tablet_vmmc2,
    };
    #endif
    
    static struct platform_device tablet_wl1271_device = {
            .name           = "reg-fixed-voltage",
            .id             = 1,
            .dev = {
                    .platform_data  = &tablet_wl1271,
            },
    };
    
    struct wl12xx_platform_data tablet_wlan_data __initdata = {
            .irq = OMAP_GPIO_IRQ(139),
            .board_ref_clock = 2,
    };
    //#endif
    
    #ifdef CONFIG_WL1271_WLAN
    static struct platform_device tablet_wl1271_device = {
            .name = "tiwlan_pm_driver",
            .id   = -1,
            .dev = {
            .platform_data = NULL,
            },
    };
    #endif
    
    static struct omap2_hsmmc_info mmc[] = {
    	{
    		.mmc		= 1,
    		.caps		= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
    		.gpio_cd   = -EINVAL,
    		.gpio_wp   = -EINVAL,
    	},
        {
         .name           = "wl1271",
         .mmc            = 2,
         .caps           = MMC_CAP_4_BIT_DATA, // | MMC_CAP_POWER_OFF_CARD,
         .gpio_wp        = -EINVAL,
         .gpio_cd        = -EINVAL,
         .nonremovable   = true,
        },
        {}	/* Terminator */
    };
    
    static struct regulator_consumer_supply beagle_vmmc1_supply = {
    	.supply			= "vmmc",
    };
    
    static struct regulator_consumer_supply beagle_vsim_supply = {
    	.supply			= "vmmc_aux",
    };
    
    static struct regulator_consumer_supply beagle_vaux3_supply = {
    	.supply         = "cam_1v8",
    };
    
    static struct regulator_consumer_supply beagle_vaux4_supply = {
    	.supply         = "cam_2v8",
    };
    
    static struct gpio_led gpio_leds[];
    
    static int beagle_twl_gpio_setup(struct device *dev,
    		unsigned gpio, unsigned ngpio)
    {
          int r;
    
          switch(omap3_beagle_get_rev()) {
               case OMAP3BEAGLE_BOARD_XMAB:
               case OMAP3BEAGLE_BOARD_XMC:
                    mmc[0].gpio_wp = -EINVAL;
                    break;
               case OMAP3BEAGLE_BOARD_C1_3:
               case OMAP3BEAGLE_BOARD_C4:
    		omap_mux_init_gpio(23, OMAP_PIN_INPUT);
    		mmc[0].gpio_wp = 23;
    		break;
               default:
    		omap_mux_init_gpio(29, OMAP_PIN_INPUT);
    	}
    	/* gpio + 0 is "mmc0_cd" (input/IRQ) */
    	mmc[0].gpio_cd = gpio + 0;
    	omap2_hsmmc_init(mmc);
    
    	/* link regulators to MMC adapters */
    	beagle_vmmc1_supply.dev = mmc[0].dev;
    	beagle_vsim_supply.dev = mmc[0].dev;
    
    	/* REVISIT: need ehci-omap hooks for external VBUS
    	 * power switch and overcurrent detect
    	 */
    
    	if ((omap3_beagle_get_rev() != OMAP3BEAGLE_BOARD_XMAB) && (omap3_beagle_get_rev() != OMAP3BEAGLE_BOARD_XMC)) {
                    r = gpio_request(gpio + 1, "EHCI_nOC");
                    if (!r) {
                           r = gpio_direction_input(gpio + 1);
                           if (r)
                                   gpio_free(gpio + 1);
                    }
                    if (r)
                           pr_err("%s: unable to configure EHCI_nOC\n", __func__);
             }
    
            /*
            * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, xM Ax/Bx active
            * high / others active low)
            */
    #ifndef CONFIG_TABLET_CUSTOMIZATIONS
            gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR");
            if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XMAB)
                    gpio_direction_output(gpio + TWL4030_GPIO_MAX, 1);
            else
                    gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
    #endif
    
            /* DVI reset GPIO is different between beagle revisions */
            switch(omap3_beagle_get_rev()) {
                case OMAP3BEAGLE_BOARD_AXBX:
                case OMAP3BEAGLE_BOARD_C1_3:
                case OMAP3BEAGLE_BOARD_C4:
                    beagle_dvi_device.reset_gpio = 170;
                    break;
                case OMAP3BEAGLE_BOARD_XMAB:
                case OMAP3BEAGLE_BOARD_XMC:
                default:
                    beagle_dvi_device.reset_gpio = 129;
            }
    
    	/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
    	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
    
            /*
            * gpio + 1 on xM controls the TFP410's enable line (active low)
            * gpio + 2 control varies depending on the board rev as follows:
            * P7/P8 revisions(prototype): Camera EN
            * A2+ revisions (production): LDO (supplies DVI, serial, led blocks)
            */
            if ((omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XMAB) || (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XMC)) {
                   r = gpio_request(gpio + 1, "nDVI_PWR_EN");
                   if (!r) {
                           r = gpio_direction_output(gpio + 1, 0);
                           if (r)
                                   gpio_free(gpio + 1);
                   }
                   if (r)
                           pr_err("%s: unable to configure nDVI_PWR_EN\n",
                                   __func__);
                   r = gpio_request(gpio + 2, "DVI_LDO_EN");
                   if (!r) {
                           r = gpio_direction_output(gpio + 2, 1);
                           if (r)
                                   gpio_free(gpio + 2);
                   }
                   if (r)
                           pr_err("%s: unable to configure DVI_LDO_EN\n",
                                   __func__);
            }
    
    	return 0;
    }
    
    static struct twl4030_gpio_platform_data beagle_gpio_data = {
    	.gpio_base	= OMAP_MAX_GPIO_LINES,
    	.irq_base	= TWL4030_GPIO_IRQ_BASE,
    	.irq_end	= TWL4030_GPIO_IRQ_END,
    	.use_leds	= true,
    	.pullups	= BIT(1),
    	.pulldowns	= BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
    				| BIT(15) | BIT(16) | BIT(17),
    	.setup		= beagle_twl_gpio_setup,
    };
    
    /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
    static struct regulator_init_data beagle_vmmc1 = {
    	.constraints = {
    		.min_uV			= 1850000,
    		.max_uV			= 3150000,
    		.valid_modes_mask	= REGULATOR_MODE_NORMAL
    					| REGULATOR_MODE_STANDBY,
    		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
    					| REGULATOR_CHANGE_MODE
    					| REGULATOR_CHANGE_STATUS,
    	},
    	.num_consumer_supplies	= 1,
    	.consumer_supplies	= &beagle_vmmc1_supply,
    };
    
    /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
    static struct regulator_init_data beagle_vsim = {
    	.constraints = {
    		.min_uV			= 1800000,
    		.max_uV			= 3000000,
    		.valid_modes_mask	= REGULATOR_MODE_NORMAL
    					| REGULATOR_MODE_STANDBY,
    		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
    					| REGULATOR_CHANGE_MODE
    					| REGULATOR_CHANGE_STATUS,
    	},
    	.num_consumer_supplies	= 1,
    	.consumer_supplies	= &beagle_vsim_supply,
    };
    
    /* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
    static struct regulator_init_data beagle_vdac = {
    	.constraints = {
    		.min_uV			= 1800000,
    		.max_uV			= 1800000,
    		.valid_modes_mask	= REGULATOR_MODE_NORMAL
    					| REGULATOR_MODE_STANDBY,
    		.valid_ops_mask		= REGULATOR_CHANGE_MODE
    					| REGULATOR_CHANGE_STATUS,
    	},
    	.num_consumer_supplies	= 1,
    	.consumer_supplies	= &beagle_vdac_supply,
    };
    
    /* VPLL2 for digital video outputs */
    static struct regulator_init_data beagle_vpll2 = {
    	.constraints = {
    		.name			= "VDVI",
    		.min_uV			= 1800000,
    		.max_uV			= 1800000,
    		.valid_modes_mask	= REGULATOR_MODE_NORMAL
    					| REGULATOR_MODE_STANDBY,
    		.valid_ops_mask		= REGULATOR_CHANGE_MODE
    					| REGULATOR_CHANGE_STATUS,
    	},
    	.num_consumer_supplies	= 1,
    	.consumer_supplies	= &beagle_vdvi_supply,
    };
    
    /* VAUX3 for CAM_1V8 */
    static struct regulator_init_data beagle_vaux3 = {
    	.constraints = {
    		.min_uV                 = 1800000,
    		.max_uV                 = 1800000,
    		.apply_uV               = true,
    		.valid_modes_mask       = REGULATOR_MODE_NORMAL
    					| REGULATOR_MODE_STANDBY,
    		.valid_ops_mask         = REGULATOR_CHANGE_MODE
    					| REGULATOR_CHANGE_STATUS,
    	},
    	.num_consumer_supplies  = 1,
    	.consumer_supplies      = &beagle_vaux3_supply,
    };
    
     /* VAUX4 for CAM_2V8 */
    static struct regulator_init_data beagle_vaux4 = {
    	.constraints = {
    		.min_uV                 = 1800000,
    		.max_uV                 = 1800000,
    		.apply_uV               = true,
    		.valid_modes_mask       = REGULATOR_MODE_NORMAL
    			| REGULATOR_MODE_STANDBY,
    		.valid_ops_mask         = REGULATOR_CHANGE_MODE
    			| REGULATOR_CHANGE_STATUS,
    	},
    	.num_consumer_supplies  = 1,
    	.consumer_supplies      = &beagle_vaux4_supply,
    };
    
    static struct twl4030_usb_data beagle_usb_data = {
    	.usb_mode	= T2_USB_MODE_ULPI,
    };
    
    static struct twl4030_codec_audio_data beagle_audio_data = {
    	.audio_mclk = 26000000,
    };
    
    static struct twl4030_codec_data beagle_codec_data = {
    	.audio_mclk = 26000000,
    	.audio = &beagle_audio_data,
    };
    
    static struct twl4030_platform_data beagle_twldata = {
    	.irq_base	= TWL4030_IRQ_BASE,
    	.irq_end	= TWL4030_IRQ_END,
    
    	/* platform_data for children goes here */
    	.usb		= &beagle_usb_data,
    	.gpio		= &beagle_gpio_data,
    	.codec		= &beagle_codec_data,
    	.vmmc1		= &beagle_vmmc1,
    //	.vmmc2          = &tablet_vmmc2,
    	.vsim		= &beagle_vsim,
    	.vdac		= &beagle_vdac,
    	.vpll2		= &beagle_vpll2,
    	.vaux3		= &beagle_vaux3,
    	.vaux4		= &beagle_vaux4,
    };
    
    static struct i2c_board_info __initdata beagle_i2c_boardinfo[] = {
    	{
    		I2C_BOARD_INFO("twl4030", 0x48),
    		.flags = I2C_CLIENT_WAKE,
    		.irq = INT_34XX_SYS_NIRQ,
    		.platform_data = &beagle_twldata,
    	},
    };
    
    static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
           {
                   I2C_BOARD_INFO("eeprom", 0x50),
           },
    };
    
    static int __init omap3_beagle_i2c_init(void)
    {
    	omap_register_i2c_bus(1, 2600, beagle_i2c_boardinfo,
    			ARRAY_SIZE(beagle_i2c_boardinfo));
    
    	/* Bus 2 is used for Camera/Sensor interface */
    	omap_register_i2c_bus(2, 400, NULL, 0);
    
    	/* Bus 3 is attached to the DVI port where devices like the pico DLP
    	 * projector don't work reliably with 400kHz */
    	omap_register_i2c_bus(3, 100, beagle_i2c_eeprom, ARRAY_SIZE(beagle_i2c_eeprom));
    
    	return 0;
    }
    
    static struct gpio_led gpio_leds[] = {
    	{
    		.name			= "beagleboard::usr0",
    		.default_trigger	= "heartbeat",
    		.gpio			= 150,
    	},
    	{
    		.name			= "beagleboard::usr1",
    		.default_trigger	= "mmc0",
    		.gpio			= 149,
    	},
    	{
    		.name			= "beagleboard::pmu_stat",
    		.gpio			= -EINVAL,	/* gets replaced */
    		.active_low		= true,
    	},
    };
    
    static struct gpio_led_platform_data gpio_led_info = {
    	.leds		= gpio_leds,
    	.num_leds	= ARRAY_SIZE(gpio_leds),
    };
    
    static struct platform_device leds_gpio = {
    	.name	= "leds-gpio",
    	.id	= -1,
    	.dev	= {
    		.platform_data	= &gpio_led_info,
    	},
    };
    
    static struct gpio_keys_button gpio_buttons[] = {
    	{
    		.code			= BTN_EXTRA,
    		.gpio			= 7,
    		.desc			= "user",
    		.wakeup			= 1,
    	},
    };
    
    static struct gpio_keys_platform_data gpio_key_info = {
    	.buttons	= gpio_buttons,
    	.nbuttons	= ARRAY_SIZE(gpio_buttons),
    };
    
    static struct platform_device keys_gpio = {
    	.name	= "gpio-keys",
    	.id	= -1,
    	.dev	= {
    		.platform_data	= &gpio_key_info,
    	},
    };
    
    static void __init omap3_beagle_init_irq(void)
    {
    	omap2_init_common_infrastructure();
    	omap2_init_common_devices(mt46h32m32lf6_sdrc_params,
    				  mt46h32m32lf6_sdrc_params);
    	omap_init_irq();
    	gpmc_init();
    #ifdef CONFIG_OMAP_32K_TIMER
    	omap2_gp_clockevent_set_gptimer(12);
    #endif
    }
    
    static struct platform_device *omap3_beagle_devices[] __initdata = {
    	&leds_gpio,
    	&keys_gpio,
    	&beagle_dss_device,
    };
    
    static void __init omap3beagle_flash_init(void)
    {
    	u8 cs = 0;
    	u8 nandcs = GPMC_CS_NUM + 1;
    
    	/* find out the chip-select on which NAND exists */
    	while (cs < GPMC_CS_NUM) {
    		u32 ret = 0;
    		ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
    
    		if ((ret & 0xC00) == 0x800) {
    			printk(KERN_INFO "Found NAND on CS%d\n", cs);
    			if (nandcs > GPMC_CS_NUM)
    				nandcs = cs;
    		}
    		cs++;
    	}
    
    	if (nandcs > GPMC_CS_NUM) {
    		printk(KERN_INFO "NAND: Unable to find configuration "
    				 "in GPMC\n ");
    		return;
    	}
    
    	if (nandcs < GPMC_CS_NUM) {
    		omap3beagle_nand_data.cs = nandcs;
    
    		printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
    		if (gpmc_nand_init(&omap3beagle_nand_data) < 0)
    			printk(KERN_ERR "Unable to register NAND device\n");
    	}
    }
    
    static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
    
    	.port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
    	.port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
    	.port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
    
    	.phy_reset  = true,
    	.reset_gpio_port[0]  = -EINVAL,
    	.reset_gpio_port[1]  = 147,
    	.reset_gpio_port[2]  = -EINVAL
    };
    
    #ifdef CONFIG_OMAP_MUX
    static struct omap_board_mux board_mux[] __initdata = {
    	{ .reg_offset = OMAP_MUX_TERMINATOR },
    };
    #endif
    
    static struct omap_musb_board_data musb_board_data = {
    	.interface_type		= MUSB_INTERFACE_ULPI,
    	.mode			= MUSB_OTG,
    	.power			= 100,
    };
    
    static void hub_reset(void)
    {
            if (gpio_request(163, "USB HUB reset") < 0)
                   printk(KERN_ERR "can't get USB HUB reset GPIO\n");
    
            gpio_direction_output(163, 0);
    
    //        gpio_free(163);
    }
    
    static void __init omap3_beagle_init(void)
    {
    	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
    	omap3_beagle_init_rev();
    	omap3_beagle_i2c_init();
    	platform_add_devices(omap3_beagle_devices,
    			ARRAY_SIZE(omap3_beagle_devices));
    	omap_serial_init();
    
    	omap_mux_init_gpio(170, OMAP_PIN_INPUT);
    	gpio_request(170, "DVI_nPD");
    	/* REVISIT leave DVI powered down until it's needed ... */
    	gpio_direction_output(170, true);
    
    	usb_musb_init(&musb_board_data);
    	usb_ehci_init(&ehci_pdata);
    	omap3beagle_flash_init();
    
    	hub_reset();
    
            if (wl12xx_set_platform_data(&tablet_wlan_data))
                    pr_err("error setting wl12xx data\n");
            platform_device_register(&tablet_wl1271_device);
    
    	/* Ensure SDRC pins are mux'd for self-refresh */
    	omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
    	omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
    
    	beagle_display_init();
    }
    
    MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
    	/* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
    	.boot_params	= 0x80000100,
    	.map_io		= omap3_map_io,
    	.reserve	= omap_reserve,
    	.init_irq	= omap3_beagle_init_irq,
    	.init_machine	= omap3_beagle_init,
    	.timer		= &omap_timer,
    MACHINE_END
    
    Hi all,

    an update: I've just compiled new driver wl12xx either on my kernel 2.6.32 using compat wireless, or on 2.6.37 kernel from DVSDK_04_03_00_06.
    all the drivers are correctly loaded, but the device's not detected. I'm using a board file derived from the beagleboard one, modified to
    configure mmc2 and wl1271. The pinmux is correctly set and the device powered (not twl4020). The probe function on wl1271_sdio.c
    isn't called. Attached my board file (just renamed from .c into .txt).

     

    Do you have any suggestion?


    BR,

    Giordano

  • Moving from MCP to NLCP so easily :)

    I would suggest you to check the carddetect kernel patch areas. 

    - Elad 

  • Hi Elad,

    ok, move from kernel 2.6.32 into 2.6.37.

    move from MCP to NLCP driver.

     

    But the SDIO still don't work...like it is disable. Which is the "carddetect kernel patch area" that you told? Where i can found it?

     

    Tnx,

    Giordano

  • Hi Giordano,

    Basicly the WLAN device always attach to the SDIO. But accessing the SDIO without toggle the WLAN_EN will have no response.

    So there is a SW patch "card-detect" where when you change the WLAN_EN pin, you simulate a "sw card insertion/removal" to the linux kernel, so the SDIO will be load/unload.

    - Elad.


  • Hi,

    now I'm using kernel 2.6.37 from DSK 5.3.2, patched for the carddetect using the complete set from
    http://lists.infradead.org/pipermail/linux-arm-kernel/2010-July/019703.html.
    I correctly set WLAN_EN & IRQ. My tiwi is not connected to the twl4030 power.

    I do: modprode wl1271_sdio:

    cfg80211: Calling CRDA to update world regulatory domain                                                                                                          
    wl1271: loaded                                                                                                                                                    
    wl1271: initialized   

    then, ifconfig wlan0 up:
                                                                                         
    omap_zoom_wlan_power: set power 1                                                                                                                                 
    omap_zoom_wlan_power: set power 0                                                                                                                                 
    omap_zoom_wlan_power: set power 1                                                                                                                                 
    omap_zoom_wlan_set_carddetect: 1                                                                                                                                  
    mmci-omap-hs mmci-omap-hs.1: could not set regulator OCR (-22)                                                                                                    
    ------------[ cut here ]------------                                                                                                                              
    WARNING: at drivers/regulator/core.c:1371 _regulator_disable+0x68/0x17c()                                                                                         
    unbalanced disables for dummy                                                                                                                                     
    Modules linked in: wl1271_sdio wl1271 mac80211 cfg80211 [last unloaded: cfg80211]                                                                                 
    [<c0049b0c>] (unwind_backtrace+0x0/0xec) from [<c00723f4>] (warn_slowpath_common+0x4c/0x64)                                                                       
    [<c00723f4>] (warn_slowpath_common+0x4c/0x64) from [<c00724a0>] (warn_slowpath_fmt+0x30/0x40)                                                                     
    [<c00724a0>] (warn_slowpath_fmt+0x30/0x40) from [<c023d538>] (_regulator_disable+0x68/0x17c)                                                                      
    [<c023d538>] (_regulator_disable+0x68/0x17c) from [<c023d67c>] (regulator_disable+0x30/0x74)                                                                      
    [<c023d67c>] (regulator_disable+0x30/0x74) from [<c035145c>] (omap_hsmmc_23_set_power+0xb0/0x108)                                                                 
    [<c035145c>] (omap_hsmmc_23_set_power+0xb0/0x108) from [<c035033c>] (omap_hsmmc_set_ios+0x78/0x428)                                                               
    [<c035033c>] (omap_hsmmc_set_ios+0x78/0x428) from [<c03421b4>] (mmc_power_off+0x54/0x5c)                                                                          
    [<c03421b4>] (mmc_power_off+0x54/0x5c) from [<c034398c>] (mmc_rescan+0x33c/0x380)                                                                                 
    [<c034398c>] (mmc_rescan+0x33c/0x380) from [<c0088570>] (process_one_work+0x2f4/0x4ec)                                                                            
    [<c0088570>] (process_one_work+0x2f4/0x4ec) from [<c0088d50>] (worker_thread+0x200/0x410)                                                                         
    [<c0088d50>] (worker_thread+0x200/0x410) from [<c008e430>] (kthread+0x80/0x88)                                                                                    
    [<c008e430>] (kthread+0x80/0x88) from [<c0044d30>] (kernel_thread_exit+0x0/0x8)                                                                                   
    ---[ end trace 1b75b31a2719ed23 ]---                                                                                                                              
    wl1271: ERROR wl1271_sdio_set_power: unsuccessful SDIO init (0)


  • giordano,

    If you are now using the kernel from SDK SDK v5.03 as in the below link, than the the SDIO driver should be updated with everything needed so I don't think you needed to apply these patches.

    http://processors.wiki.ti.com/index.php/AM37x_release_download_page

     

    Can you verify that your board file is similar to the omap3evm.c file as in the sdk link above?

     

    One link that might help you as well is:

    http://processors.wiki.ti.com/index.php/OMAP_Wireless_Connectivity_Hardware_Porting_for_new_Platform

     

    Best Regards,

    Eyal Reizer