* [U-Boot] [PATCH v3 2/4] sf: Place the sf calls in proper order
[not found] <1371822543-7929-1-git-send-email-jaganna@xilinx.com>
@ 2013-06-21 13:49 ` Jagannadha Sutradharudu Teki
2013-06-23 18:05 ` Jagan Teki
2013-06-21 13:49 ` [U-Boot] [PATCH v3 3/4] sf: Add debug messages on spi_flash_read_common Jagannadha Sutradharudu Teki
2013-06-21 13:49 ` [U-Boot] [PATCH v3 4/4] sf: Warn to use BAR for > 16MiB flashes Jagannadha Sutradharudu Teki
2 siblings, 1 reply; 6+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-06-21 13:49 UTC (permalink / raw)
To: u-boot
From: Jagannadha Sutradharudu Teki <jagannadha.sutradharudu-teki@xilinx.com>
Placed the sf calls in proper order - erase/write/read
Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v3:
-
Changes for v2:
-
drivers/mtd/spi/spi_flash.c | 184 ++++++++++++++++++++++----------------------
1 file changed, 92 insertions(+), 92 deletions(-)
diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index 03cecef..a329850 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -68,6 +68,51 @@ int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
return spi_flash_read_write(spi, cmd, cmd_len, data, NULL, data_len);
}
+int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
+{
+ struct spi_slave *spi = flash->spi;
+ unsigned long timebase;
+ int ret;
+ u8 status;
+ u8 check_status = 0x0;
+ u8 poll_bit = STATUS_WIP;
+ u8 cmd = flash->poll_cmd;
+
+ if (cmd == CMD_FLAG_STATUS) {
+ poll_bit = STATUS_PEC;
+ check_status = poll_bit;
+ }
+
+ ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
+ if (ret) {
+ debug("SF: fail to read %s status register\n",
+ cmd == CMD_READ_STATUS ? "read" : "flag");
+ return ret;
+ }
+
+ timebase = get_timer(0);
+ do {
+ WATCHDOG_RESET();
+
+ ret = spi_xfer(spi, 8, NULL, &status, 0);
+ if (ret)
+ return -1;
+
+ if ((status & poll_bit) == check_status)
+ break;
+
+ } while (get_timer(timebase) < timeout);
+
+ spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
+
+ if ((status & poll_bit) == check_status)
+ return 0;
+
+ /* Timed out */
+ debug("SF: time out!\n");
+ return -1;
+}
+
int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
size_t cmd_len, const void *buf, size_t buf_len)
{
@@ -109,6 +154,53 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
return ret;
}
+int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
+{
+ u32 erase_size;
+ u8 cmd[4];
+ int ret = -1;
+
+ erase_size = flash->sector_size;
+ if (offset % erase_size || len % erase_size) {
+ debug("SF: Erase offset/length not multiple of erase size\n");
+ return -1;
+ }
+
+ if (erase_size == 4096)
+ cmd[0] = CMD_ERASE_4K;
+ else
+ cmd[0] = CMD_ERASE_64K;
+
+ while (len) {
+#ifdef CONFIG_SPI_FLASH_BAR
+ u8 bank_sel;
+
+ bank_sel = offset / SPI_FLASH_16MB_BOUN;
+
+ ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
+ if (ret) {
+ debug("SF: fail to set bank%d\n", bank_sel);
+ return ret;
+ }
+#endif
+ spi_flash_addr(offset, cmd);
+
+ debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
+ cmd[2], cmd[3], offset);
+
+ ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
+ if (ret < 0) {
+ debug("SF: erase failed\n");
+ break;
+ }
+
+ offset += erase_size;
+ len -= erase_size;
+ }
+
+ return ret;
+}
+
int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset,
size_t len, const void *buf)
{
@@ -218,98 +310,6 @@ int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
return ret;
}
-int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
-{
- struct spi_slave *spi = flash->spi;
- unsigned long timebase;
- int ret;
- u8 status;
- u8 check_status = 0x0;
- u8 poll_bit = STATUS_WIP;
- u8 cmd = flash->poll_cmd;
-
- if (cmd == CMD_FLAG_STATUS) {
- poll_bit = STATUS_PEC;
- check_status = poll_bit;
- }
-
- ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
- if (ret) {
- debug("SF: fail to read %s status register\n",
- cmd == CMD_READ_STATUS ? "read" : "flag");
- return ret;
- }
-
- timebase = get_timer(0);
- do {
- WATCHDOG_RESET();
-
- ret = spi_xfer(spi, 8, NULL, &status, 0);
- if (ret)
- return -1;
-
- if ((status & poll_bit) == check_status)
- break;
-
- } while (get_timer(timebase) < timeout);
-
- spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
-
- if ((status & poll_bit) == check_status)
- return 0;
-
- /* Timed out */
- debug("SF: time out!\n");
- return -1;
-}
-
-int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
-{
- u32 erase_size;
- u8 cmd[4];
- int ret = -1;
-
- erase_size = flash->sector_size;
- if (offset % erase_size || len % erase_size) {
- debug("SF: Erase offset/length not multiple of erase size\n");
- return -1;
- }
-
- if (erase_size == 4096)
- cmd[0] = CMD_ERASE_4K;
- else
- cmd[0] = CMD_ERASE_64K;
-
- while (len) {
-#ifdef CONFIG_SPI_FLASH_BAR
- u8 bank_sel;
-
- bank_sel = offset / SPI_FLASH_16MB_BOUN;
-
- ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
- if (ret) {
- debug("SF: fail to set bank%d\n", bank_sel);
- return ret;
- }
-#endif
- spi_flash_addr(offset, cmd);
-
- debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
- cmd[2], cmd[3], offset);
-
- ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
- if (ret < 0) {
- debug("SF: erase failed\n");
- break;
- }
-
- offset += erase_size;
- len -= erase_size;
- }
-
- return ret;
-}
-
int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr)
{
u8 cmd;
--
1.8.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v3 3/4] sf: Add debug messages on spi_flash_read_common
[not found] <1371822543-7929-1-git-send-email-jaganna@xilinx.com>
2013-06-21 13:49 ` [U-Boot] [PATCH v3 2/4] sf: Place the sf calls in proper order Jagannadha Sutradharudu Teki
@ 2013-06-21 13:49 ` Jagannadha Sutradharudu Teki
2013-06-23 18:05 ` Jagan Teki
2013-06-21 13:49 ` [U-Boot] [PATCH v3 4/4] sf: Warn to use BAR for > 16MiB flashes Jagannadha Sutradharudu Teki
2 siblings, 1 reply; 6+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-06-21 13:49 UTC (permalink / raw)
To: u-boot
- Added debug's on spi_flash_read_common()
- Added space
Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v3:
-
Changes for v2:
-
drivers/mtd/spi/spi_flash.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index a329850..51142d8 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -254,8 +254,18 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
struct spi_slave *spi = flash->spi;
int ret;
- spi_claim_bus(spi);
+ ret = spi_claim_bus(flash->spi);
+ if (ret) {
+ debug("SF: unable to claim SPI bus\n");
+ return ret;
+ }
+
ret = spi_flash_cmd_read(spi, cmd, cmd_len, data, data_len);
+ if (ret < 0) {
+ debug("SF: read cmd failed\n");
+ return ret;
+ }
+
spi_release_bus(spi);
return ret;
--
1.8.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v3 4/4] sf: Warn to use BAR for > 16MiB flashes
[not found] <1371822543-7929-1-git-send-email-jaganna@xilinx.com>
2013-06-21 13:49 ` [U-Boot] [PATCH v3 2/4] sf: Place the sf calls in proper order Jagannadha Sutradharudu Teki
2013-06-21 13:49 ` [U-Boot] [PATCH v3 3/4] sf: Add debug messages on spi_flash_read_common Jagannadha Sutradharudu Teki
@ 2013-06-21 13:49 ` Jagannadha Sutradharudu Teki
2013-06-23 18:05 ` Jagan Teki
2 siblings, 1 reply; 6+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-06-21 13:49 UTC (permalink / raw)
To: u-boot
From: Jagannadha Sutradharudu Teki <jagannadha.sutradharudu-teki@xilinx.com>
Warning for > 16MiB flashes to #define CONFIG_SPI_FLASH_BAR
Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v3:
-
Changes for v2:
-
drivers/mtd/spi/spi_flash.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index 51142d8..a468208 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -557,6 +557,12 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
if (flash->memory_map)
printf(", mapped at %p", flash->memory_map);
puts("\n");
+#ifndef CONFIG_SPI_FLASH_BAR
+ if (flash->size > SPI_FLASH_16MB_BOUN) {
+ puts("SF: Warning - Only lower 16MiB accessible,");
+ puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
+ }
+#endif
spi_release_bus(spi);
--
1.8.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v3 2/4] sf: Place the sf calls in proper order
2013-06-21 13:49 ` [U-Boot] [PATCH v3 2/4] sf: Place the sf calls in proper order Jagannadha Sutradharudu Teki
@ 2013-06-23 18:05 ` Jagan Teki
0 siblings, 0 replies; 6+ messages in thread
From: Jagan Teki @ 2013-06-23 18:05 UTC (permalink / raw)
To: u-boot
On 21-06-2013 19:19, Jagannadha Sutradharudu Teki wrote:
> From: Jagannadha Sutradharudu Teki <jagannadha.sutradharudu-teki@xilinx.com>
>
> Placed the sf calls in proper order - erase/write/read
>
> Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
> ---
> Changes for v3:
> -
> Changes for v2:
> -
>
> drivers/mtd/spi/spi_flash.c | 184 ++++++++++++++++++++++----------------------
> 1 file changed, 92 insertions(+), 92 deletions(-)
>
> diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
> index 03cecef..a329850 100644
> --- a/drivers/mtd/spi/spi_flash.c
> +++ b/drivers/mtd/spi/spi_flash.c
> @@ -68,6 +68,51 @@ int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
> return spi_flash_read_write(spi, cmd, cmd_len, data, NULL, data_len);
> }
>
> +int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
> +{
> + struct spi_slave *spi = flash->spi;
> + unsigned long timebase;
> + int ret;
> + u8 status;
> + u8 check_status = 0x0;
> + u8 poll_bit = STATUS_WIP;
> + u8 cmd = flash->poll_cmd;
> +
> + if (cmd == CMD_FLAG_STATUS) {
> + poll_bit = STATUS_PEC;
> + check_status = poll_bit;
> + }
> +
> + ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
> + if (ret) {
> + debug("SF: fail to read %s status register\n",
> + cmd == CMD_READ_STATUS ? "read" : "flag");
> + return ret;
> + }
> +
> + timebase = get_timer(0);
> + do {
> + WATCHDOG_RESET();
> +
> + ret = spi_xfer(spi, 8, NULL, &status, 0);
> + if (ret)
> + return -1;
> +
> + if ((status & poll_bit) == check_status)
> + break;
> +
> + } while (get_timer(timebase) < timeout);
> +
> + spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
> +
> + if ((status & poll_bit) == check_status)
> + return 0;
> +
> + /* Timed out */
> + debug("SF: time out!\n");
> + return -1;
> +}
> +
> int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
> size_t cmd_len, const void *buf, size_t buf_len)
> {
> @@ -109,6 +154,53 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
> return ret;
> }
>
> +int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
> +{
> + u32 erase_size;
> + u8 cmd[4];
> + int ret = -1;
> +
> + erase_size = flash->sector_size;
> + if (offset % erase_size || len % erase_size) {
> + debug("SF: Erase offset/length not multiple of erase size\n");
> + return -1;
> + }
> +
> + if (erase_size == 4096)
> + cmd[0] = CMD_ERASE_4K;
> + else
> + cmd[0] = CMD_ERASE_64K;
> +
> + while (len) {
> +#ifdef CONFIG_SPI_FLASH_BAR
> + u8 bank_sel;
> +
> + bank_sel = offset / SPI_FLASH_16MB_BOUN;
> +
> + ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
> + if (ret) {
> + debug("SF: fail to set bank%d\n", bank_sel);
> + return ret;
> + }
> +#endif
> + spi_flash_addr(offset, cmd);
> +
> + debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
> + cmd[2], cmd[3], offset);
> +
> + ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
> + if (ret < 0) {
> + debug("SF: erase failed\n");
> + break;
> + }
> +
> + offset += erase_size;
> + len -= erase_size;
> + }
> +
> + return ret;
> +}
> +
> int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset,
> size_t len, const void *buf)
> {
> @@ -218,98 +310,6 @@ int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
> return ret;
> }
>
> -int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
> -{
> - struct spi_slave *spi = flash->spi;
> - unsigned long timebase;
> - int ret;
> - u8 status;
> - u8 check_status = 0x0;
> - u8 poll_bit = STATUS_WIP;
> - u8 cmd = flash->poll_cmd;
> -
> - if (cmd == CMD_FLAG_STATUS) {
> - poll_bit = STATUS_PEC;
> - check_status = poll_bit;
> - }
> -
> - ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
> - if (ret) {
> - debug("SF: fail to read %s status register\n",
> - cmd == CMD_READ_STATUS ? "read" : "flag");
> - return ret;
> - }
> -
> - timebase = get_timer(0);
> - do {
> - WATCHDOG_RESET();
> -
> - ret = spi_xfer(spi, 8, NULL, &status, 0);
> - if (ret)
> - return -1;
> -
> - if ((status & poll_bit) == check_status)
> - break;
> -
> - } while (get_timer(timebase) < timeout);
> -
> - spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
> -
> - if ((status & poll_bit) == check_status)
> - return 0;
> -
> - /* Timed out */
> - debug("SF: time out!\n");
> - return -1;
> -}
> -
> -int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
> -{
> - u32 erase_size;
> - u8 cmd[4];
> - int ret = -1;
> -
> - erase_size = flash->sector_size;
> - if (offset % erase_size || len % erase_size) {
> - debug("SF: Erase offset/length not multiple of erase size\n");
> - return -1;
> - }
> -
> - if (erase_size == 4096)
> - cmd[0] = CMD_ERASE_4K;
> - else
> - cmd[0] = CMD_ERASE_64K;
> -
> - while (len) {
> -#ifdef CONFIG_SPI_FLASH_BAR
> - u8 bank_sel;
> -
> - bank_sel = offset / SPI_FLASH_16MB_BOUN;
> -
> - ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
> - if (ret) {
> - debug("SF: fail to set bank%d\n", bank_sel);
> - return ret;
> - }
> -#endif
> - spi_flash_addr(offset, cmd);
> -
> - debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
> - cmd[2], cmd[3], offset);
> -
> - ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
> - if (ret < 0) {
> - debug("SF: erase failed\n");
> - break;
> - }
> -
> - offset += erase_size;
> - len -= erase_size;
> - }
> -
> - return ret;
> -}
> -
> int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr)
> {
> u8 cmd;
>
Applied to u-boot-spi/master
--
Thanks,
Jagan.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v3 3/4] sf: Add debug messages on spi_flash_read_common
2013-06-21 13:49 ` [U-Boot] [PATCH v3 3/4] sf: Add debug messages on spi_flash_read_common Jagannadha Sutradharudu Teki
@ 2013-06-23 18:05 ` Jagan Teki
0 siblings, 0 replies; 6+ messages in thread
From: Jagan Teki @ 2013-06-23 18:05 UTC (permalink / raw)
To: u-boot
On 21-06-2013 19:19, Jagannadha Sutradharudu Teki wrote:
> - Added debug's on spi_flash_read_common()
> - Added space
>
> Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
> ---
> Changes for v3:
> -
> Changes for v2:
> -
>
> drivers/mtd/spi/spi_flash.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
> index a329850..51142d8 100644
> --- a/drivers/mtd/spi/spi_flash.c
> +++ b/drivers/mtd/spi/spi_flash.c
> @@ -254,8 +254,18 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
> struct spi_slave *spi = flash->spi;
> int ret;
>
> - spi_claim_bus(spi);
> + ret = spi_claim_bus(flash->spi);
> + if (ret) {
> + debug("SF: unable to claim SPI bus\n");
> + return ret;
> + }
> +
> ret = spi_flash_cmd_read(spi, cmd, cmd_len, data, data_len);
> + if (ret < 0) {
> + debug("SF: read cmd failed\n");
> + return ret;
> + }
> +
> spi_release_bus(spi);
>
> return ret;
>
Applied to u-boot-spi/master
--
Thanks,
Jagan.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v3 4/4] sf: Warn to use BAR for > 16MiB flashes
2013-06-21 13:49 ` [U-Boot] [PATCH v3 4/4] sf: Warn to use BAR for > 16MiB flashes Jagannadha Sutradharudu Teki
@ 2013-06-23 18:05 ` Jagan Teki
0 siblings, 0 replies; 6+ messages in thread
From: Jagan Teki @ 2013-06-23 18:05 UTC (permalink / raw)
To: u-boot
On 21-06-2013 19:19, Jagannadha Sutradharudu Teki wrote:
> From: Jagannadha Sutradharudu Teki <jagannadha.sutradharudu-teki@xilinx.com>
>
> Warning for > 16MiB flashes to #define CONFIG_SPI_FLASH_BAR
>
> Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
> ---
> Changes for v3:
> -
> Changes for v2:
> -
>
> drivers/mtd/spi/spi_flash.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
> index 51142d8..a468208 100644
> --- a/drivers/mtd/spi/spi_flash.c
> +++ b/drivers/mtd/spi/spi_flash.c
> @@ -557,6 +557,12 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
> if (flash->memory_map)
> printf(", mapped at %p", flash->memory_map);
> puts("\n");
> +#ifndef CONFIG_SPI_FLASH_BAR
> + if (flash->size > SPI_FLASH_16MB_BOUN) {
> + puts("SF: Warning - Only lower 16MiB accessible,");
> + puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
> + }
> +#endif
>
> spi_release_bus(spi);
>
>
Applied to u-boot-spi/master
--
Thanks,
Jagan.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-06-23 18:05 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1371822543-7929-1-git-send-email-jaganna@xilinx.com>
2013-06-21 13:49 ` [U-Boot] [PATCH v3 2/4] sf: Place the sf calls in proper order Jagannadha Sutradharudu Teki
2013-06-23 18:05 ` Jagan Teki
2013-06-21 13:49 ` [U-Boot] [PATCH v3 3/4] sf: Add debug messages on spi_flash_read_common Jagannadha Sutradharudu Teki
2013-06-23 18:05 ` Jagan Teki
2013-06-21 13:49 ` [U-Boot] [PATCH v3 4/4] sf: Warn to use BAR for > 16MiB flashes Jagannadha Sutradharudu Teki
2013-06-23 18:05 ` Jagan Teki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox