Linux Audio

Check our new training course

Loading...
v6.8
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
   4 * All rights reserved.
   5 */
   6
   7#include <linux/clk.h>
   8#include <linux/spi/spi.h>
   9#include <linux/crc7.h>
  10#include <linux/crc-itu-t.h>
  11#include <linux/gpio/consumer.h>
  12
  13#include "netdev.h"
  14#include "cfg80211.h"
  15
  16#define SPI_MODALIAS		"wilc1000_spi"
  17
  18static bool enable_crc7;	/* protect SPI commands with CRC7 */
  19module_param(enable_crc7, bool, 0644);
  20MODULE_PARM_DESC(enable_crc7,
  21		 "Enable CRC7 checksum to protect command transfers\n"
  22		 "\t\t\tagainst corruption during the SPI transfer.\n"
  23		 "\t\t\tCommand transfers are short and the CPU-cycle cost\n"
  24		 "\t\t\tof enabling this is small.");
  25
  26static bool enable_crc16;	/* protect SPI data with CRC16 */
  27module_param(enable_crc16, bool, 0644);
  28MODULE_PARM_DESC(enable_crc16,
  29		 "Enable CRC16 checksum to protect data transfers\n"
  30		 "\t\t\tagainst corruption during the SPI transfer.\n"
  31		 "\t\t\tData transfers can be large and the CPU-cycle cost\n"
  32		 "\t\t\tof enabling this may be substantial.");
  33
  34/*
  35 * For CMD_SINGLE_READ and CMD_INTERNAL_READ, WILC may insert one or
  36 * more zero bytes between the command response and the DATA Start tag
  37 * (0xf3).  This behavior appears to be undocumented in "ATWILC1000
  38 * USER GUIDE" (https://tinyurl.com/4hhshdts) but we have observed 1-4
  39 * zero bytes when the SPI bus operates at 48MHz and none when it
  40 * operates at 1MHz.
  41 */
  42#define WILC_SPI_RSP_HDR_EXTRA_DATA	8
  43
  44struct wilc_spi {
  45	bool isinit;		/* true if SPI protocol has been configured */
  46	bool probing_crc;	/* true if we're probing chip's CRC config */
  47	bool crc7_enabled;	/* true if crc7 is currently enabled */
  48	bool crc16_enabled;	/* true if crc16 is currently enabled */
  49	struct wilc_gpios {
  50		struct gpio_desc *enable;	/* ENABLE GPIO or NULL */
  51		struct gpio_desc *reset;	/* RESET GPIO or NULL */
  52	} gpios;
  53};
  54
  55static const struct wilc_hif_func wilc_hif_spi;
  56
  57static int wilc_spi_reset(struct wilc *wilc);
 
 
  58
  59/********************************************
  60 *
  61 *      Spi protocol Function
  62 *
  63 ********************************************/
  64
  65#define CMD_DMA_WRITE				0xc1
  66#define CMD_DMA_READ				0xc2
  67#define CMD_INTERNAL_WRITE			0xc3
  68#define CMD_INTERNAL_READ			0xc4
  69#define CMD_TERMINATE				0xc5
  70#define CMD_REPEAT				0xc6
  71#define CMD_DMA_EXT_WRITE			0xc7
  72#define CMD_DMA_EXT_READ			0xc8
  73#define CMD_SINGLE_WRITE			0xc9
  74#define CMD_SINGLE_READ				0xca
  75#define CMD_RESET				0xcf
  76
  77#define SPI_RETRY_MAX_LIMIT			10
  78#define SPI_ENABLE_VMM_RETRY_LIMIT		2
  79
  80/* SPI response fields (section 11.1.2 in ATWILC1000 User Guide): */
  81#define RSP_START_FIELD				GENMASK(7, 4)
  82#define RSP_TYPE_FIELD				GENMASK(3, 0)
  83
  84/* SPI response values for the response fields: */
  85#define RSP_START_TAG				0xc
  86#define RSP_TYPE_FIRST_PACKET			0x1
  87#define RSP_TYPE_INNER_PACKET			0x2
  88#define RSP_TYPE_LAST_PACKET			0x3
  89#define RSP_STATE_NO_ERROR			0x00
  90
  91#define PROTOCOL_REG_PKT_SZ_MASK		GENMASK(6, 4)
  92#define PROTOCOL_REG_CRC16_MASK			GENMASK(3, 3)
  93#define PROTOCOL_REG_CRC7_MASK			GENMASK(2, 2)
  94
  95/*
  96 * The SPI data packet size may be any integer power of two in the
  97 * range from 256 to 8192 bytes.
  98 */
  99#define DATA_PKT_LOG_SZ_MIN			8	/* 256 B */
 100#define DATA_PKT_LOG_SZ_MAX			13	/* 8 KiB */
 101
 102/*
 103 * Select the data packet size (log2 of number of bytes): Use the
 104 * maximum data packet size.  We only retransmit complete packets, so
 105 * there is no benefit from using smaller data packets.
 106 */
 107#define DATA_PKT_LOG_SZ				DATA_PKT_LOG_SZ_MAX
 108#define DATA_PKT_SZ				(1 << DATA_PKT_LOG_SZ)
 109
 110#define WILC_SPI_COMMAND_STAT_SUCCESS		0
 111#define WILC_GET_RESP_HDR_START(h)		(((h) >> 4) & 0xf)
 112
 113struct wilc_spi_cmd {
 114	u8 cmd_type;
 115	union {
 116		struct {
 117			u8 addr[3];
 118			u8 crc[];
 119		} __packed simple_cmd;
 120		struct {
 121			u8 addr[3];
 122			u8 size[2];
 123			u8 crc[];
 124		} __packed dma_cmd;
 125		struct {
 126			u8 addr[3];
 127			u8 size[3];
 128			u8 crc[];
 129		} __packed dma_cmd_ext;
 130		struct {
 131			u8 addr[2];
 132			__be32 data;
 133			u8 crc[];
 134		} __packed internal_w_cmd;
 135		struct {
 136			u8 addr[3];
 137			__be32 data;
 138			u8 crc[];
 139		} __packed w_cmd;
 140	} u;
 141} __packed;
 142
 143struct wilc_spi_read_rsp_data {
 144	u8 header;
 145	u8 data[4];
 146	u8 crc[];
 147} __packed;
 148
 149struct wilc_spi_rsp_data {
 150	u8 rsp_cmd_type;
 151	u8 status;
 152	u8 data[];
 153} __packed;
 154
 155struct wilc_spi_special_cmd_rsp {
 156	u8 skip_byte;
 157	u8 rsp_cmd_type;
 158	u8 status;
 159} __packed;
 160
 161static int wilc_parse_gpios(struct wilc *wilc)
 162{
 163	struct spi_device *spi = to_spi_device(wilc->dev);
 164	struct wilc_spi *spi_priv = wilc->bus_data;
 165	struct wilc_gpios *gpios = &spi_priv->gpios;
 166
 167	/* get ENABLE pin and deassert it (if it is defined): */
 168	gpios->enable = devm_gpiod_get_optional(&spi->dev,
 169						"enable", GPIOD_OUT_LOW);
 170	/* get RESET pin and assert it (if it is defined): */
 171	if (gpios->enable) {
 172		/* if enable pin exists, reset must exist as well */
 173		gpios->reset = devm_gpiod_get(&spi->dev,
 174					      "reset", GPIOD_OUT_HIGH);
 175		if (IS_ERR(gpios->reset)) {
 176			dev_err(&spi->dev, "missing reset gpio.\n");
 177			return PTR_ERR(gpios->reset);
 178		}
 179	} else {
 180		gpios->reset = devm_gpiod_get_optional(&spi->dev,
 181						       "reset", GPIOD_OUT_HIGH);
 182	}
 183	return 0;
 184}
 185
 186static void wilc_wlan_power(struct wilc *wilc, bool on)
 187{
 188	struct wilc_spi *spi_priv = wilc->bus_data;
 189	struct wilc_gpios *gpios = &spi_priv->gpios;
 190
 191	if (on) {
 192		/* assert ENABLE: */
 193		gpiod_set_value(gpios->enable, 1);
 194		mdelay(5);
 195		/* assert RESET: */
 196		gpiod_set_value(gpios->reset, 1);
 197	} else {
 198		/* deassert RESET: */
 199		gpiod_set_value(gpios->reset, 0);
 
 
 
 200		/* deassert ENABLE: */
 201		gpiod_set_value(gpios->enable, 0);
 202	}
 203}
 204
 205static int wilc_bus_probe(struct spi_device *spi)
 206{
 207	int ret;
 208	struct wilc *wilc;
 209	struct wilc_spi *spi_priv;
 210
 211	spi_priv = kzalloc(sizeof(*spi_priv), GFP_KERNEL);
 212	if (!spi_priv)
 213		return -ENOMEM;
 214
 215	ret = wilc_cfg80211_init(&wilc, &spi->dev, WILC_HIF_SPI, &wilc_hif_spi);
 216	if (ret)
 217		goto free;
 218
 219	spi_set_drvdata(spi, wilc);
 220	wilc->dev = &spi->dev;
 221	wilc->bus_data = spi_priv;
 222	wilc->dev_irq_num = spi->irq;
 223
 224	ret = wilc_parse_gpios(wilc);
 225	if (ret < 0)
 226		goto netdev_cleanup;
 227
 228	wilc->rtc_clk = devm_clk_get_optional(&spi->dev, "rtc");
 229	if (IS_ERR(wilc->rtc_clk)) {
 230		ret = PTR_ERR(wilc->rtc_clk);
 231		goto netdev_cleanup;
 232	}
 233	clk_prepare_enable(wilc->rtc_clk);
 234
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 235	return 0;
 236
 
 
 
 237netdev_cleanup:
 238	wilc_netdev_cleanup(wilc);
 239free:
 240	kfree(spi_priv);
 241	return ret;
 242}
 243
 244static void wilc_bus_remove(struct spi_device *spi)
 245{
 246	struct wilc *wilc = spi_get_drvdata(spi);
 247	struct wilc_spi *spi_priv = wilc->bus_data;
 248
 249	clk_disable_unprepare(wilc->rtc_clk);
 250	wilc_netdev_cleanup(wilc);
 251	kfree(spi_priv);
 252}
 253
 254static const struct of_device_id wilc_of_match[] = {
 255	{ .compatible = "microchip,wilc1000", },
 256	{ /* sentinel */ }
 257};
 258MODULE_DEVICE_TABLE(of, wilc_of_match);
 259
 260static const struct spi_device_id wilc_spi_id[] = {
 261	{ "wilc1000", 0 },
 262	{ /* sentinel */ }
 263};
 264MODULE_DEVICE_TABLE(spi, wilc_spi_id);
 265
 266static struct spi_driver wilc_spi_driver = {
 267	.driver = {
 268		.name = SPI_MODALIAS,
 269		.of_match_table = wilc_of_match,
 270	},
 271	.id_table = wilc_spi_id,
 272	.probe =  wilc_bus_probe,
 273	.remove = wilc_bus_remove,
 274};
 275module_spi_driver(wilc_spi_driver);
 276MODULE_DESCRIPTION("Atmel WILC1000 SPI wireless driver");
 277MODULE_LICENSE("GPL");
 278
 279static int wilc_spi_tx(struct wilc *wilc, u8 *b, u32 len)
 280{
 281	struct spi_device *spi = to_spi_device(wilc->dev);
 282	int ret;
 283	struct spi_message msg;
 284
 285	if (len > 0 && b) {
 286		struct spi_transfer tr = {
 287			.tx_buf = b,
 288			.len = len,
 289			.delay = {
 290				.value = 0,
 291				.unit = SPI_DELAY_UNIT_USECS
 292			},
 293		};
 294		char *r_buffer = kzalloc(len, GFP_KERNEL);
 295
 296		if (!r_buffer)
 297			return -ENOMEM;
 298
 299		tr.rx_buf = r_buffer;
 300		dev_dbg(&spi->dev, "Request writing %d bytes\n", len);
 301
 302		memset(&msg, 0, sizeof(msg));
 303		spi_message_init(&msg);
 304		msg.spi = spi;
 305		spi_message_add_tail(&tr, &msg);
 306
 307		ret = spi_sync(spi, &msg);
 308		if (ret < 0)
 309			dev_err(&spi->dev, "SPI transaction failed\n");
 310
 311		kfree(r_buffer);
 312	} else {
 313		dev_err(&spi->dev,
 314			"can't write data with the following length: %d\n",
 315			len);
 316		ret = -EINVAL;
 317	}
 318
 319	return ret;
 320}
 321
 322static int wilc_spi_rx(struct wilc *wilc, u8 *rb, u32 rlen)
 323{
 324	struct spi_device *spi = to_spi_device(wilc->dev);
 325	int ret;
 326
 327	if (rlen > 0) {
 328		struct spi_message msg;
 329		struct spi_transfer tr = {
 330			.rx_buf = rb,
 331			.len = rlen,
 332			.delay = {
 333				.value = 0,
 334				.unit = SPI_DELAY_UNIT_USECS
 335			},
 336
 337		};
 338		char *t_buffer = kzalloc(rlen, GFP_KERNEL);
 339
 340		if (!t_buffer)
 341			return -ENOMEM;
 342
 343		tr.tx_buf = t_buffer;
 344
 345		memset(&msg, 0, sizeof(msg));
 346		spi_message_init(&msg);
 347		msg.spi = spi;
 348		spi_message_add_tail(&tr, &msg);
 349
 350		ret = spi_sync(spi, &msg);
 351		if (ret < 0)
 352			dev_err(&spi->dev, "SPI transaction failed\n");
 353		kfree(t_buffer);
 354	} else {
 355		dev_err(&spi->dev,
 356			"can't read data with the following length: %u\n",
 357			rlen);
 358		ret = -EINVAL;
 359	}
 360
 361	return ret;
 362}
 363
 364static int wilc_spi_tx_rx(struct wilc *wilc, u8 *wb, u8 *rb, u32 rlen)
 365{
 366	struct spi_device *spi = to_spi_device(wilc->dev);
 367	int ret;
 368
 369	if (rlen > 0) {
 370		struct spi_message msg;
 371		struct spi_transfer tr = {
 372			.rx_buf = rb,
 373			.tx_buf = wb,
 374			.len = rlen,
 375			.bits_per_word = 8,
 376			.delay = {
 377				.value = 0,
 378				.unit = SPI_DELAY_UNIT_USECS
 379			},
 380
 381		};
 382
 383		memset(&msg, 0, sizeof(msg));
 384		spi_message_init(&msg);
 385		msg.spi = spi;
 386
 387		spi_message_add_tail(&tr, &msg);
 388		ret = spi_sync(spi, &msg);
 389		if (ret < 0)
 390			dev_err(&spi->dev, "SPI transaction failed\n");
 391	} else {
 392		dev_err(&spi->dev,
 393			"can't read data with the following length: %u\n",
 394			rlen);
 395		ret = -EINVAL;
 396	}
 397
 398	return ret;
 399}
 400
 401static int spi_data_write(struct wilc *wilc, u8 *b, u32 sz)
 402{
 403	struct spi_device *spi = to_spi_device(wilc->dev);
 404	struct wilc_spi *spi_priv = wilc->bus_data;
 405	int ix, nbytes;
 406	int result = 0;
 407	u8 cmd, order, crc[2];
 408	u16 crc_calc;
 409
 410	/*
 411	 * Data
 412	 */
 413	ix = 0;
 414	do {
 415		if (sz <= DATA_PKT_SZ) {
 416			nbytes = sz;
 417			order = 0x3;
 418		} else {
 419			nbytes = DATA_PKT_SZ;
 420			if (ix == 0)
 421				order = 0x1;
 422			else
 423				order = 0x02;
 424		}
 425
 426		/*
 427		 * Write command
 428		 */
 429		cmd = 0xf0;
 430		cmd |= order;
 431
 432		if (wilc_spi_tx(wilc, &cmd, 1)) {
 433			dev_err(&spi->dev,
 434				"Failed data block cmd write, bus error...\n");
 435			result = -EINVAL;
 436			break;
 437		}
 438
 439		/*
 440		 * Write data
 441		 */
 442		if (wilc_spi_tx(wilc, &b[ix], nbytes)) {
 443			dev_err(&spi->dev,
 444				"Failed data block write, bus error...\n");
 445			result = -EINVAL;
 446			break;
 447		}
 448
 449		/*
 450		 * Write CRC
 451		 */
 452		if (spi_priv->crc16_enabled) {
 453			crc_calc = crc_itu_t(0xffff, &b[ix], nbytes);
 454			crc[0] = crc_calc >> 8;
 455			crc[1] = crc_calc;
 456			if (wilc_spi_tx(wilc, crc, 2)) {
 457				dev_err(&spi->dev, "Failed data block crc write, bus error...\n");
 458				result = -EINVAL;
 459				break;
 460			}
 461		}
 462
 463		/*
 464		 * No need to wait for response
 465		 */
 466		ix += nbytes;
 467		sz -= nbytes;
 468	} while (sz);
 469
 470	return result;
 471}
 472
 473/********************************************
 474 *
 475 *      Spi Internal Read/Write Function
 476 *
 477 ********************************************/
 478static u8 wilc_get_crc7(u8 *buffer, u32 len)
 479{
 480	return crc7_be(0xfe, buffer, len);
 481}
 482
 483static int wilc_spi_single_read(struct wilc *wilc, u8 cmd, u32 adr, void *b,
 484				u8 clockless)
 485{
 486	struct spi_device *spi = to_spi_device(wilc->dev);
 487	struct wilc_spi *spi_priv = wilc->bus_data;
 488	u8 wb[32], rb[32];
 489	int cmd_len, resp_len, i;
 490	u16 crc_calc, crc_recv;
 491	struct wilc_spi_cmd *c;
 492	struct wilc_spi_rsp_data *r;
 493	struct wilc_spi_read_rsp_data *r_data;
 494
 495	memset(wb, 0x0, sizeof(wb));
 496	memset(rb, 0x0, sizeof(rb));
 497	c = (struct wilc_spi_cmd *)wb;
 498	c->cmd_type = cmd;
 499	if (cmd == CMD_SINGLE_READ) {
 500		c->u.simple_cmd.addr[0] = adr >> 16;
 501		c->u.simple_cmd.addr[1] = adr >> 8;
 502		c->u.simple_cmd.addr[2] = adr;
 503	} else if (cmd == CMD_INTERNAL_READ) {
 504		c->u.simple_cmd.addr[0] = adr >> 8;
 505		if (clockless == 1)
 506			c->u.simple_cmd.addr[0] |= BIT(7);
 507		c->u.simple_cmd.addr[1] = adr;
 508		c->u.simple_cmd.addr[2] = 0x0;
 509	} else {
 510		dev_err(&spi->dev, "cmd [%x] not supported\n", cmd);
 511		return -EINVAL;
 512	}
 513
 514	cmd_len = offsetof(struct wilc_spi_cmd, u.simple_cmd.crc);
 515	resp_len = sizeof(*r) + sizeof(*r_data) + WILC_SPI_RSP_HDR_EXTRA_DATA;
 516
 517	if (spi_priv->crc7_enabled) {
 518		c->u.simple_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 519		cmd_len += 1;
 520		resp_len += 2;
 521	}
 522
 523	if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
 524		dev_err(&spi->dev,
 525			"spi buffer size too small (%d) (%d) (%zu)\n",
 526			cmd_len, resp_len, ARRAY_SIZE(wb));
 527		return -EINVAL;
 528	}
 529
 530	if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
 531		dev_err(&spi->dev, "Failed cmd write, bus error...\n");
 532		return -EINVAL;
 533	}
 534
 535	r = (struct wilc_spi_rsp_data *)&rb[cmd_len];
 536	if (r->rsp_cmd_type != cmd && !clockless) {
 537		if (!spi_priv->probing_crc)
 538			dev_err(&spi->dev,
 539				"Failed cmd, cmd (%02x), resp (%02x)\n",
 540				cmd, r->rsp_cmd_type);
 541		return -EINVAL;
 542	}
 543
 544	if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS && !clockless) {
 545		dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
 546			r->status);
 547		return -EINVAL;
 548	}
 549
 550	for (i = 0; i < WILC_SPI_RSP_HDR_EXTRA_DATA; ++i)
 551		if (WILC_GET_RESP_HDR_START(r->data[i]) == 0xf)
 552			break;
 553
 554	if (i >= WILC_SPI_RSP_HDR_EXTRA_DATA) {
 555		dev_err(&spi->dev, "Error, data start missing\n");
 556		return -EINVAL;
 557	}
 558
 559	r_data = (struct wilc_spi_read_rsp_data *)&r->data[i];
 560
 561	if (b)
 562		memcpy(b, r_data->data, 4);
 563
 564	if (!clockless && spi_priv->crc16_enabled) {
 565		crc_recv = (r_data->crc[0] << 8) | r_data->crc[1];
 566		crc_calc = crc_itu_t(0xffff, r_data->data, 4);
 567		if (crc_recv != crc_calc) {
 568			dev_err(&spi->dev, "%s: bad CRC 0x%04x "
 569				"(calculated 0x%04x)\n", __func__,
 570				crc_recv, crc_calc);
 571			return -EINVAL;
 572		}
 573	}
 574
 575	return 0;
 576}
 577
 578static int wilc_spi_write_cmd(struct wilc *wilc, u8 cmd, u32 adr, u32 data,
 579			      u8 clockless)
 580{
 581	struct spi_device *spi = to_spi_device(wilc->dev);
 582	struct wilc_spi *spi_priv = wilc->bus_data;
 583	u8 wb[32], rb[32];
 584	int cmd_len, resp_len;
 585	struct wilc_spi_cmd *c;
 586	struct wilc_spi_rsp_data *r;
 587
 588	memset(wb, 0x0, sizeof(wb));
 589	memset(rb, 0x0, sizeof(rb));
 590	c = (struct wilc_spi_cmd *)wb;
 591	c->cmd_type = cmd;
 592	if (cmd == CMD_INTERNAL_WRITE) {
 593		c->u.internal_w_cmd.addr[0] = adr >> 8;
 594		if (clockless == 1)
 595			c->u.internal_w_cmd.addr[0] |= BIT(7);
 596
 597		c->u.internal_w_cmd.addr[1] = adr;
 598		c->u.internal_w_cmd.data = cpu_to_be32(data);
 599		cmd_len = offsetof(struct wilc_spi_cmd, u.internal_w_cmd.crc);
 600		if (spi_priv->crc7_enabled)
 601			c->u.internal_w_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 602	} else if (cmd == CMD_SINGLE_WRITE) {
 603		c->u.w_cmd.addr[0] = adr >> 16;
 604		c->u.w_cmd.addr[1] = adr >> 8;
 605		c->u.w_cmd.addr[2] = adr;
 606		c->u.w_cmd.data = cpu_to_be32(data);
 607		cmd_len = offsetof(struct wilc_spi_cmd, u.w_cmd.crc);
 608		if (spi_priv->crc7_enabled)
 609			c->u.w_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 610	} else {
 611		dev_err(&spi->dev, "write cmd [%x] not supported\n", cmd);
 612		return -EINVAL;
 613	}
 614
 615	if (spi_priv->crc7_enabled)
 616		cmd_len += 1;
 617
 618	resp_len = sizeof(*r);
 619
 620	if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
 621		dev_err(&spi->dev,
 622			"spi buffer size too small (%d) (%d) (%zu)\n",
 623			cmd_len, resp_len, ARRAY_SIZE(wb));
 624		return -EINVAL;
 625	}
 626
 627	if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
 628		dev_err(&spi->dev, "Failed cmd write, bus error...\n");
 629		return -EINVAL;
 630	}
 631
 632	r = (struct wilc_spi_rsp_data *)&rb[cmd_len];
 633	/*
 634	 * Clockless registers operations might return unexptected responses,
 635	 * even if successful.
 636	 */
 637	if (r->rsp_cmd_type != cmd && !clockless) {
 638		dev_err(&spi->dev,
 639			"Failed cmd response, cmd (%02x), resp (%02x)\n",
 640			cmd, r->rsp_cmd_type);
 641		return -EINVAL;
 642	}
 643
 644	if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS && !clockless) {
 645		dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
 646			r->status);
 647		return -EINVAL;
 648	}
 649
 650	return 0;
 651}
 652
 653static int wilc_spi_dma_rw(struct wilc *wilc, u8 cmd, u32 adr, u8 *b, u32 sz)
 654{
 655	struct spi_device *spi = to_spi_device(wilc->dev);
 656	struct wilc_spi *spi_priv = wilc->bus_data;
 657	u16 crc_recv, crc_calc;
 658	u8 wb[32], rb[32];
 659	int cmd_len, resp_len;
 660	int retry, ix = 0;
 661	u8 crc[2];
 662	struct wilc_spi_cmd *c;
 663	struct wilc_spi_rsp_data *r;
 664
 665	memset(wb, 0x0, sizeof(wb));
 666	memset(rb, 0x0, sizeof(rb));
 667	c = (struct wilc_spi_cmd *)wb;
 668	c->cmd_type = cmd;
 669	if (cmd == CMD_DMA_WRITE || cmd == CMD_DMA_READ) {
 670		c->u.dma_cmd.addr[0] = adr >> 16;
 671		c->u.dma_cmd.addr[1] = adr >> 8;
 672		c->u.dma_cmd.addr[2] = adr;
 673		c->u.dma_cmd.size[0] = sz >> 8;
 674		c->u.dma_cmd.size[1] = sz;
 675		cmd_len = offsetof(struct wilc_spi_cmd, u.dma_cmd.crc);
 676		if (spi_priv->crc7_enabled)
 677			c->u.dma_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 678	} else if (cmd == CMD_DMA_EXT_WRITE || cmd == CMD_DMA_EXT_READ) {
 679		c->u.dma_cmd_ext.addr[0] = adr >> 16;
 680		c->u.dma_cmd_ext.addr[1] = adr >> 8;
 681		c->u.dma_cmd_ext.addr[2] = adr;
 682		c->u.dma_cmd_ext.size[0] = sz >> 16;
 683		c->u.dma_cmd_ext.size[1] = sz >> 8;
 684		c->u.dma_cmd_ext.size[2] = sz;
 685		cmd_len = offsetof(struct wilc_spi_cmd, u.dma_cmd_ext.crc);
 686		if (spi_priv->crc7_enabled)
 687			c->u.dma_cmd_ext.crc[0] = wilc_get_crc7(wb, cmd_len);
 688	} else {
 689		dev_err(&spi->dev, "dma read write cmd [%x] not supported\n",
 690			cmd);
 691		return -EINVAL;
 692	}
 693	if (spi_priv->crc7_enabled)
 694		cmd_len += 1;
 695
 696	resp_len = sizeof(*r);
 697
 698	if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
 699		dev_err(&spi->dev, "spi buffer size too small (%d)(%d) (%zu)\n",
 700			cmd_len, resp_len, ARRAY_SIZE(wb));
 701		return -EINVAL;
 702	}
 703
 704	if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
 705		dev_err(&spi->dev, "Failed cmd write, bus error...\n");
 706		return -EINVAL;
 707	}
 708
 709	r = (struct wilc_spi_rsp_data *)&rb[cmd_len];
 710	if (r->rsp_cmd_type != cmd) {
 711		dev_err(&spi->dev,
 712			"Failed cmd response, cmd (%02x), resp (%02x)\n",
 713			cmd, r->rsp_cmd_type);
 714		return -EINVAL;
 715	}
 716
 717	if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS) {
 718		dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
 719			r->status);
 720		return -EINVAL;
 721	}
 722
 723	if (cmd == CMD_DMA_WRITE || cmd == CMD_DMA_EXT_WRITE)
 724		return 0;
 725
 726	while (sz > 0) {
 727		int nbytes;
 728		u8 rsp;
 729
 730		nbytes = min_t(u32, sz, DATA_PKT_SZ);
 731
 732		/*
 733		 * Data Response header
 734		 */
 735		retry = 100;
 736		do {
 737			if (wilc_spi_rx(wilc, &rsp, 1)) {
 738				dev_err(&spi->dev,
 739					"Failed resp read, bus err\n");
 740				return -EINVAL;
 741			}
 742			if (WILC_GET_RESP_HDR_START(rsp) == 0xf)
 743				break;
 744		} while (retry--);
 745
 746		/*
 747		 * Read bytes
 748		 */
 749		if (wilc_spi_rx(wilc, &b[ix], nbytes)) {
 750			dev_err(&spi->dev,
 751				"Failed block read, bus err\n");
 752			return -EINVAL;
 753		}
 754
 755		/*
 756		 * Read CRC
 757		 */
 758		if (spi_priv->crc16_enabled) {
 759			if (wilc_spi_rx(wilc, crc, 2)) {
 760				dev_err(&spi->dev,
 761					"Failed block CRC read, bus err\n");
 762				return -EINVAL;
 763			}
 764			crc_recv = (crc[0] << 8) | crc[1];
 765			crc_calc = crc_itu_t(0xffff, &b[ix], nbytes);
 766			if (crc_recv != crc_calc) {
 767				dev_err(&spi->dev, "%s: bad CRC 0x%04x "
 768					"(calculated 0x%04x)\n", __func__,
 769					crc_recv, crc_calc);
 770				return -EINVAL;
 771			}
 772		}
 773
 774		ix += nbytes;
 775		sz -= nbytes;
 776	}
 777	return 0;
 778}
 779
 780static int wilc_spi_special_cmd(struct wilc *wilc, u8 cmd)
 781{
 782	struct spi_device *spi = to_spi_device(wilc->dev);
 783	struct wilc_spi *spi_priv = wilc->bus_data;
 784	u8 wb[32], rb[32];
 785	int cmd_len, resp_len = 0;
 786	struct wilc_spi_cmd *c;
 787	struct wilc_spi_special_cmd_rsp *r;
 788
 789	if (cmd != CMD_TERMINATE && cmd != CMD_REPEAT && cmd != CMD_RESET)
 790		return -EINVAL;
 791
 792	memset(wb, 0x0, sizeof(wb));
 793	memset(rb, 0x0, sizeof(rb));
 794	c = (struct wilc_spi_cmd *)wb;
 795	c->cmd_type = cmd;
 796
 797	if (cmd == CMD_RESET)
 798		memset(c->u.simple_cmd.addr, 0xFF, 3);
 799
 800	cmd_len = offsetof(struct wilc_spi_cmd, u.simple_cmd.crc);
 801	resp_len = sizeof(*r);
 802
 803	if (spi_priv->crc7_enabled) {
 804		c->u.simple_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 805		cmd_len += 1;
 806	}
 807	if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
 808		dev_err(&spi->dev, "spi buffer size too small (%d) (%d) (%zu)\n",
 809			cmd_len, resp_len, ARRAY_SIZE(wb));
 810		return -EINVAL;
 811	}
 812
 813	if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
 814		dev_err(&spi->dev, "Failed cmd write, bus error...\n");
 815		return -EINVAL;
 816	}
 817
 818	r = (struct wilc_spi_special_cmd_rsp *)&rb[cmd_len];
 819	if (r->rsp_cmd_type != cmd) {
 820		if (!spi_priv->probing_crc)
 821			dev_err(&spi->dev,
 822				"Failed cmd response, cmd (%02x), resp (%02x)\n",
 823				cmd, r->rsp_cmd_type);
 824		return -EINVAL;
 825	}
 826
 827	if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS) {
 828		dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
 829			r->status);
 830		return -EINVAL;
 831	}
 832	return 0;
 833}
 834
 835static void wilc_spi_reset_cmd_sequence(struct wilc *wl, u8 attempt, u32 addr)
 836{
 837	struct spi_device *spi = to_spi_device(wl->dev);
 838	struct wilc_spi *spi_priv = wl->bus_data;
 839
 840	if (!spi_priv->probing_crc)
 841		dev_err(&spi->dev, "Reset and retry %d %x\n", attempt, addr);
 842
 843	usleep_range(1000, 1100);
 844	wilc_spi_reset(wl);
 845	usleep_range(1000, 1100);
 846}
 847
 848static int wilc_spi_read_reg(struct wilc *wilc, u32 addr, u32 *data)
 849{
 850	struct spi_device *spi = to_spi_device(wilc->dev);
 851	int result;
 852	u8 cmd = CMD_SINGLE_READ;
 853	u8 clockless = 0;
 854	u8 i;
 855
 856	if (addr <= WILC_SPI_CLOCKLESS_ADDR_LIMIT) {
 857		/* Clockless register */
 858		cmd = CMD_INTERNAL_READ;
 859		clockless = 1;
 860	}
 861
 862	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 863		result = wilc_spi_single_read(wilc, cmd, addr, data, clockless);
 864		if (!result) {
 865			le32_to_cpus(data);
 866			return 0;
 867		}
 868
 869		/* retry is not applicable for clockless registers */
 870		if (clockless)
 871			break;
 872
 873		dev_err(&spi->dev, "Failed cmd, read reg (%08x)...\n", addr);
 874		wilc_spi_reset_cmd_sequence(wilc, i, addr);
 875	}
 876
 877	return result;
 878}
 879
 880static int wilc_spi_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
 881{
 882	struct spi_device *spi = to_spi_device(wilc->dev);
 883	int result;
 884	u8 i;
 885
 886	if (size <= 4)
 887		return -EINVAL;
 888
 889	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 890		result = wilc_spi_dma_rw(wilc, CMD_DMA_EXT_READ, addr,
 891					 buf, size);
 892		if (!result)
 893			return 0;
 894
 895		dev_err(&spi->dev, "Failed cmd, read block (%08x)...\n", addr);
 896
 897		wilc_spi_reset_cmd_sequence(wilc, i, addr);
 898	}
 899
 900	return result;
 901}
 902
 903static int spi_internal_write(struct wilc *wilc, u32 adr, u32 dat)
 904{
 905	struct spi_device *spi = to_spi_device(wilc->dev);
 906	int result;
 907	u8 i;
 908
 909	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 910		result = wilc_spi_write_cmd(wilc, CMD_INTERNAL_WRITE, adr,
 911					    dat, 0);
 912		if (!result)
 913			return 0;
 914		dev_err(&spi->dev, "Failed internal write cmd...\n");
 915
 916		wilc_spi_reset_cmd_sequence(wilc, i, adr);
 917	}
 918
 919	return result;
 920}
 921
 922static int spi_internal_read(struct wilc *wilc, u32 adr, u32 *data)
 923{
 924	struct spi_device *spi = to_spi_device(wilc->dev);
 925	struct wilc_spi *spi_priv = wilc->bus_data;
 926	int result;
 927	u8 i;
 928
 929	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 930		result = wilc_spi_single_read(wilc, CMD_INTERNAL_READ, adr,
 931					      data, 0);
 932		if (!result) {
 933			le32_to_cpus(data);
 934			return 0;
 935		}
 936		if (!spi_priv->probing_crc)
 937			dev_err(&spi->dev, "Failed internal read cmd...\n");
 938
 939		wilc_spi_reset_cmd_sequence(wilc, i, adr);
 940	}
 941
 942	return result;
 943}
 944
 945/********************************************
 946 *
 947 *      Spi interfaces
 948 *
 949 ********************************************/
 950
 951static int wilc_spi_write_reg(struct wilc *wilc, u32 addr, u32 data)
 952{
 953	struct spi_device *spi = to_spi_device(wilc->dev);
 954	int result;
 955	u8 cmd = CMD_SINGLE_WRITE;
 956	u8 clockless = 0;
 957	u8 i;
 958
 959	if (addr <= WILC_SPI_CLOCKLESS_ADDR_LIMIT) {
 960		/* Clockless register */
 961		cmd = CMD_INTERNAL_WRITE;
 962		clockless = 1;
 963	}
 964
 965	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 966		result = wilc_spi_write_cmd(wilc, cmd, addr, data, clockless);
 967		if (!result)
 968			return 0;
 969
 970		dev_err(&spi->dev, "Failed cmd, write reg (%08x)...\n", addr);
 971
 972		if (clockless)
 973			break;
 974
 975		wilc_spi_reset_cmd_sequence(wilc, i, addr);
 976	}
 977	return result;
 978}
 979
 980static int spi_data_rsp(struct wilc *wilc, u8 cmd)
 981{
 982	struct spi_device *spi = to_spi_device(wilc->dev);
 983	int result, i;
 984	u8 rsp[4];
 985
 986	/*
 987	 * The response to data packets is two bytes long.  For
 988	 * efficiency's sake, wilc_spi_write() wisely ignores the
 989	 * responses for all packets but the final one.  The downside
 990	 * of that optimization is that when the final data packet is
 991	 * short, we may receive (part of) the response to the
 992	 * second-to-last packet before the one for the final packet.
 993	 * To handle this, we always read 4 bytes and then search for
 994	 * the last byte that contains the "Response Start" code (0xc
 995	 * in the top 4 bits).  We then know that this byte is the
 996	 * first response byte of the final data packet.
 997	 */
 998	result = wilc_spi_rx(wilc, rsp, sizeof(rsp));
 999	if (result) {
1000		dev_err(&spi->dev, "Failed bus error...\n");
1001		return result;
1002	}
1003
1004	for (i = sizeof(rsp) - 2; i >= 0; --i)
1005		if (FIELD_GET(RSP_START_FIELD, rsp[i]) == RSP_START_TAG)
1006			break;
1007
1008	if (i < 0) {
1009		dev_err(&spi->dev,
1010			"Data packet response missing (%02x %02x %02x %02x)\n",
1011			rsp[0], rsp[1], rsp[2], rsp[3]);
1012		return -1;
1013	}
1014
1015	/* rsp[i] is the last response start byte */
1016
1017	if (FIELD_GET(RSP_TYPE_FIELD, rsp[i]) != RSP_TYPE_LAST_PACKET
1018	    || rsp[i + 1] != RSP_STATE_NO_ERROR) {
1019		dev_err(&spi->dev, "Data response error (%02x %02x)\n",
1020			rsp[i], rsp[i + 1]);
1021		return -1;
1022	}
1023	return 0;
1024}
1025
1026static int wilc_spi_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
1027{
1028	struct spi_device *spi = to_spi_device(wilc->dev);
1029	int result;
1030	u8 i;
1031
1032	/*
1033	 * has to be greated than 4
1034	 */
1035	if (size <= 4)
1036		return -EINVAL;
1037
1038	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
1039		result = wilc_spi_dma_rw(wilc, CMD_DMA_EXT_WRITE, addr,
1040					 NULL, size);
1041		if (result) {
1042			dev_err(&spi->dev,
1043				"Failed cmd, write block (%08x)...\n", addr);
1044			wilc_spi_reset_cmd_sequence(wilc, i, addr);
1045			continue;
1046		}
1047
1048		/*
1049		 * Data
1050		 */
1051		result = spi_data_write(wilc, buf, size);
1052		if (result) {
1053			dev_err(&spi->dev, "Failed block data write...\n");
1054			wilc_spi_reset_cmd_sequence(wilc, i, addr);
1055			continue;
1056		}
1057
1058		/*
1059		 * Data response
1060		 */
1061		result = spi_data_rsp(wilc, CMD_DMA_EXT_WRITE);
1062		if (result) {
1063			dev_err(&spi->dev, "Failed block data rsp...\n");
1064			wilc_spi_reset_cmd_sequence(wilc, i, addr);
1065			continue;
1066		}
1067		break;
1068	}
1069	return result;
1070}
1071
1072/********************************************
1073 *
1074 *      Bus interfaces
1075 *
1076 ********************************************/
1077
1078static int wilc_spi_reset(struct wilc *wilc)
1079{
1080	struct spi_device *spi = to_spi_device(wilc->dev);
1081	struct wilc_spi *spi_priv = wilc->bus_data;
1082	int result;
1083
1084	result = wilc_spi_special_cmd(wilc, CMD_RESET);
1085	if (result && !spi_priv->probing_crc)
1086		dev_err(&spi->dev, "Failed cmd reset\n");
1087
1088	return result;
1089}
1090
1091static bool wilc_spi_is_init(struct wilc *wilc)
1092{
1093	struct wilc_spi *spi_priv = wilc->bus_data;
1094
1095	return spi_priv->isinit;
1096}
1097
1098static int wilc_spi_deinit(struct wilc *wilc)
1099{
1100	struct wilc_spi *spi_priv = wilc->bus_data;
1101
1102	spi_priv->isinit = false;
1103	wilc_wlan_power(wilc, false);
1104	return 0;
1105}
1106
1107static int wilc_spi_init(struct wilc *wilc, bool resume)
1108{
1109	struct spi_device *spi = to_spi_device(wilc->dev);
1110	struct wilc_spi *spi_priv = wilc->bus_data;
1111	u32 reg;
1112	u32 chipid;
1113	int ret, i;
1114
1115	if (spi_priv->isinit) {
1116		/* Confirm we can read chipid register without error: */
1117		ret = wilc_spi_read_reg(wilc, WILC_CHIPID, &chipid);
1118		if (ret == 0)
1119			return 0;
1120
1121		dev_err(&spi->dev, "Fail cmd read chip id...\n");
1122	}
1123
1124	wilc_wlan_power(wilc, true);
1125
1126	/*
1127	 * configure protocol
1128	 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1129
1130	/*
1131	 * Infer the CRC settings that are currently in effect.  This
1132	 * is necessary because we can't be sure that the chip has
1133	 * been RESET (e.g, after module unload and reload).
1134	 */
1135	spi_priv->probing_crc = true;
1136	spi_priv->crc7_enabled = enable_crc7;
1137	spi_priv->crc16_enabled = false; /* don't check CRC16 during probing */
1138	for (i = 0; i < 2; ++i) {
1139		ret = spi_internal_read(wilc, WILC_SPI_PROTOCOL_OFFSET, &reg);
1140		if (ret == 0)
1141			break;
1142		spi_priv->crc7_enabled = !enable_crc7;
1143	}
1144	if (ret) {
1145		dev_err(&spi->dev, "Failed with CRC7 on and off.\n");
1146		return ret;
1147	}
1148
1149	/* set up the desired CRC configuration: */
1150	reg &= ~(PROTOCOL_REG_CRC7_MASK | PROTOCOL_REG_CRC16_MASK);
1151	if (enable_crc7)
1152		reg |= PROTOCOL_REG_CRC7_MASK;
1153	if (enable_crc16)
1154		reg |= PROTOCOL_REG_CRC16_MASK;
1155
1156	/* set up the data packet size: */
1157	BUILD_BUG_ON(DATA_PKT_LOG_SZ < DATA_PKT_LOG_SZ_MIN
1158		     || DATA_PKT_LOG_SZ > DATA_PKT_LOG_SZ_MAX);
1159	reg &= ~PROTOCOL_REG_PKT_SZ_MASK;
1160	reg |= FIELD_PREP(PROTOCOL_REG_PKT_SZ_MASK,
1161			  DATA_PKT_LOG_SZ - DATA_PKT_LOG_SZ_MIN);
1162
1163	/* establish the new setup: */
1164	ret = spi_internal_write(wilc, WILC_SPI_PROTOCOL_OFFSET, reg);
1165	if (ret) {
1166		dev_err(&spi->dev,
1167			"[wilc spi %d]: Failed internal write reg\n",
1168			__LINE__);
1169		return ret;
1170	}
1171	/* update our state to match new protocol settings: */
1172	spi_priv->crc7_enabled = enable_crc7;
1173	spi_priv->crc16_enabled = enable_crc16;
1174
1175	/* re-read to make sure new settings are in effect: */
1176	spi_internal_read(wilc, WILC_SPI_PROTOCOL_OFFSET, &reg);
1177
1178	spi_priv->probing_crc = false;
1179
 
 
 
 
 
 
 
 
 
1180	/*
1181	 * make sure can read chip id without protocol error
1182	 */
1183	ret = wilc_spi_read_reg(wilc, WILC_CHIPID, &chipid);
1184	if (ret) {
1185		dev_err(&spi->dev, "Fail cmd read chip id...\n");
1186		return ret;
1187	}
1188
1189	spi_priv->isinit = true;
1190
 
1191	return 0;
1192}
1193
1194static int wilc_spi_read_size(struct wilc *wilc, u32 *size)
1195{
1196	int ret;
1197
1198	ret = spi_internal_read(wilc,
1199				WILC_SPI_INT_STATUS - WILC_SPI_REG_BASE, size);
1200	*size = FIELD_GET(IRQ_DMA_WD_CNT_MASK, *size);
1201
1202	return ret;
1203}
1204
1205static int wilc_spi_read_int(struct wilc *wilc, u32 *int_status)
1206{
1207	return spi_internal_read(wilc, WILC_SPI_INT_STATUS - WILC_SPI_REG_BASE,
1208				 int_status);
1209}
1210
1211static int wilc_spi_clear_int_ext(struct wilc *wilc, u32 val)
1212{
1213	int ret;
1214	int retry = SPI_ENABLE_VMM_RETRY_LIMIT;
1215	u32 check;
1216
1217	while (retry) {
1218		ret = spi_internal_write(wilc,
1219					 WILC_SPI_INT_CLEAR - WILC_SPI_REG_BASE,
1220					 val);
1221		if (ret)
1222			break;
1223
1224		ret = spi_internal_read(wilc,
1225					WILC_SPI_INT_CLEAR - WILC_SPI_REG_BASE,
1226					&check);
1227		if (ret || ((check & EN_VMM) == (val & EN_VMM)))
1228			break;
1229
1230		retry--;
1231	}
1232	return ret;
1233}
1234
1235static int wilc_spi_sync_ext(struct wilc *wilc, int nint)
1236{
1237	struct spi_device *spi = to_spi_device(wilc->dev);
1238	u32 reg;
1239	int ret, i;
1240
1241	if (nint > MAX_NUM_INT) {
1242		dev_err(&spi->dev, "Too many interrupts (%d)...\n", nint);
1243		return -EINVAL;
1244	}
1245
1246	/*
1247	 * interrupt pin mux select
1248	 */
1249	ret = wilc_spi_read_reg(wilc, WILC_PIN_MUX_0, &reg);
1250	if (ret) {
1251		dev_err(&spi->dev, "Failed read reg (%08x)...\n",
1252			WILC_PIN_MUX_0);
1253		return ret;
1254	}
1255	reg |= BIT(8);
1256	ret = wilc_spi_write_reg(wilc, WILC_PIN_MUX_0, reg);
1257	if (ret) {
1258		dev_err(&spi->dev, "Failed write reg (%08x)...\n",
1259			WILC_PIN_MUX_0);
1260		return ret;
1261	}
1262
1263	/*
1264	 * interrupt enable
1265	 */
1266	ret = wilc_spi_read_reg(wilc, WILC_INTR_ENABLE, &reg);
1267	if (ret) {
1268		dev_err(&spi->dev, "Failed read reg (%08x)...\n",
1269			WILC_INTR_ENABLE);
1270		return ret;
1271	}
1272
1273	for (i = 0; (i < 5) && (nint > 0); i++, nint--)
1274		reg |= (BIT((27 + i)));
1275
1276	ret = wilc_spi_write_reg(wilc, WILC_INTR_ENABLE, reg);
1277	if (ret) {
1278		dev_err(&spi->dev, "Failed write reg (%08x)...\n",
1279			WILC_INTR_ENABLE);
1280		return ret;
1281	}
1282	if (nint) {
1283		ret = wilc_spi_read_reg(wilc, WILC_INTR2_ENABLE, &reg);
1284		if (ret) {
1285			dev_err(&spi->dev, "Failed read reg (%08x)...\n",
1286				WILC_INTR2_ENABLE);
1287			return ret;
1288		}
1289
1290		for (i = 0; (i < 3) && (nint > 0); i++, nint--)
1291			reg |= BIT(i);
1292
1293		ret = wilc_spi_write_reg(wilc, WILC_INTR2_ENABLE, reg);
1294		if (ret) {
1295			dev_err(&spi->dev, "Failed write reg (%08x)...\n",
1296				WILC_INTR2_ENABLE);
1297			return ret;
1298		}
1299	}
1300
1301	return 0;
1302}
1303
1304/* Global spi HIF function table */
1305static const struct wilc_hif_func wilc_hif_spi = {
1306	.hif_init = wilc_spi_init,
1307	.hif_deinit = wilc_spi_deinit,
1308	.hif_read_reg = wilc_spi_read_reg,
1309	.hif_write_reg = wilc_spi_write_reg,
1310	.hif_block_rx = wilc_spi_read,
1311	.hif_block_tx = wilc_spi_write,
1312	.hif_read_int = wilc_spi_read_int,
1313	.hif_clear_int_ext = wilc_spi_clear_int_ext,
1314	.hif_read_size = wilc_spi_read_size,
1315	.hif_block_tx_ext = wilc_spi_write,
1316	.hif_block_rx_ext = wilc_spi_read,
1317	.hif_sync_ext = wilc_spi_sync_ext,
1318	.hif_reset = wilc_spi_reset,
1319	.hif_is_init = wilc_spi_is_init,
1320};
v6.9.4
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
   4 * All rights reserved.
   5 */
   6
   7#include <linux/clk.h>
   8#include <linux/spi/spi.h>
   9#include <linux/crc7.h>
  10#include <linux/crc-itu-t.h>
  11#include <linux/gpio/consumer.h>
  12
  13#include "netdev.h"
  14#include "cfg80211.h"
  15
  16#define SPI_MODALIAS		"wilc1000_spi"
  17
  18static bool enable_crc7;	/* protect SPI commands with CRC7 */
  19module_param(enable_crc7, bool, 0644);
  20MODULE_PARM_DESC(enable_crc7,
  21		 "Enable CRC7 checksum to protect command transfers\n"
  22		 "\t\t\tagainst corruption during the SPI transfer.\n"
  23		 "\t\t\tCommand transfers are short and the CPU-cycle cost\n"
  24		 "\t\t\tof enabling this is small.");
  25
  26static bool enable_crc16;	/* protect SPI data with CRC16 */
  27module_param(enable_crc16, bool, 0644);
  28MODULE_PARM_DESC(enable_crc16,
  29		 "Enable CRC16 checksum to protect data transfers\n"
  30		 "\t\t\tagainst corruption during the SPI transfer.\n"
  31		 "\t\t\tData transfers can be large and the CPU-cycle cost\n"
  32		 "\t\t\tof enabling this may be substantial.");
  33
  34/*
  35 * For CMD_SINGLE_READ and CMD_INTERNAL_READ, WILC may insert one or
  36 * more zero bytes between the command response and the DATA Start tag
  37 * (0xf3).  This behavior appears to be undocumented in "ATWILC1000
  38 * USER GUIDE" (https://tinyurl.com/4hhshdts) but we have observed 1-4
  39 * zero bytes when the SPI bus operates at 48MHz and none when it
  40 * operates at 1MHz.
  41 */
  42#define WILC_SPI_RSP_HDR_EXTRA_DATA	8
  43
  44struct wilc_spi {
  45	bool isinit;		/* true if wilc_spi_init was successful */
  46	bool probing_crc;	/* true if we're probing chip's CRC config */
  47	bool crc7_enabled;	/* true if crc7 is currently enabled */
  48	bool crc16_enabled;	/* true if crc16 is currently enabled */
  49	struct wilc_gpios {
  50		struct gpio_desc *enable;	/* ENABLE GPIO or NULL */
  51		struct gpio_desc *reset;	/* RESET GPIO or NULL */
  52	} gpios;
  53};
  54
  55static const struct wilc_hif_func wilc_hif_spi;
  56
  57static int wilc_spi_reset(struct wilc *wilc);
  58static int wilc_spi_configure_bus_protocol(struct wilc *wilc);
  59static int wilc_validate_chipid(struct wilc *wilc);
  60
  61/********************************************
  62 *
  63 *      Spi protocol Function
  64 *
  65 ********************************************/
  66
  67#define CMD_DMA_WRITE				0xc1
  68#define CMD_DMA_READ				0xc2
  69#define CMD_INTERNAL_WRITE			0xc3
  70#define CMD_INTERNAL_READ			0xc4
  71#define CMD_TERMINATE				0xc5
  72#define CMD_REPEAT				0xc6
  73#define CMD_DMA_EXT_WRITE			0xc7
  74#define CMD_DMA_EXT_READ			0xc8
  75#define CMD_SINGLE_WRITE			0xc9
  76#define CMD_SINGLE_READ				0xca
  77#define CMD_RESET				0xcf
  78
  79#define SPI_RETRY_MAX_LIMIT			10
  80#define SPI_ENABLE_VMM_RETRY_LIMIT		2
  81
  82/* SPI response fields (section 11.1.2 in ATWILC1000 User Guide): */
  83#define RSP_START_FIELD				GENMASK(7, 4)
  84#define RSP_TYPE_FIELD				GENMASK(3, 0)
  85
  86/* SPI response values for the response fields: */
  87#define RSP_START_TAG				0xc
  88#define RSP_TYPE_FIRST_PACKET			0x1
  89#define RSP_TYPE_INNER_PACKET			0x2
  90#define RSP_TYPE_LAST_PACKET			0x3
  91#define RSP_STATE_NO_ERROR			0x00
  92
  93#define PROTOCOL_REG_PKT_SZ_MASK		GENMASK(6, 4)
  94#define PROTOCOL_REG_CRC16_MASK			GENMASK(3, 3)
  95#define PROTOCOL_REG_CRC7_MASK			GENMASK(2, 2)
  96
  97/*
  98 * The SPI data packet size may be any integer power of two in the
  99 * range from 256 to 8192 bytes.
 100 */
 101#define DATA_PKT_LOG_SZ_MIN			8	/* 256 B */
 102#define DATA_PKT_LOG_SZ_MAX			13	/* 8 KiB */
 103
 104/*
 105 * Select the data packet size (log2 of number of bytes): Use the
 106 * maximum data packet size.  We only retransmit complete packets, so
 107 * there is no benefit from using smaller data packets.
 108 */
 109#define DATA_PKT_LOG_SZ				DATA_PKT_LOG_SZ_MAX
 110#define DATA_PKT_SZ				(1 << DATA_PKT_LOG_SZ)
 111
 112#define WILC_SPI_COMMAND_STAT_SUCCESS		0
 113#define WILC_GET_RESP_HDR_START(h)		(((h) >> 4) & 0xf)
 114
 115struct wilc_spi_cmd {
 116	u8 cmd_type;
 117	union {
 118		struct {
 119			u8 addr[3];
 120			u8 crc[];
 121		} __packed simple_cmd;
 122		struct {
 123			u8 addr[3];
 124			u8 size[2];
 125			u8 crc[];
 126		} __packed dma_cmd;
 127		struct {
 128			u8 addr[3];
 129			u8 size[3];
 130			u8 crc[];
 131		} __packed dma_cmd_ext;
 132		struct {
 133			u8 addr[2];
 134			__be32 data;
 135			u8 crc[];
 136		} __packed internal_w_cmd;
 137		struct {
 138			u8 addr[3];
 139			__be32 data;
 140			u8 crc[];
 141		} __packed w_cmd;
 142	} u;
 143} __packed;
 144
 145struct wilc_spi_read_rsp_data {
 146	u8 header;
 147	u8 data[4];
 148	u8 crc[];
 149} __packed;
 150
 151struct wilc_spi_rsp_data {
 152	u8 rsp_cmd_type;
 153	u8 status;
 154	u8 data[];
 155} __packed;
 156
 157struct wilc_spi_special_cmd_rsp {
 158	u8 skip_byte;
 159	u8 rsp_cmd_type;
 160	u8 status;
 161} __packed;
 162
 163static int wilc_parse_gpios(struct wilc *wilc)
 164{
 165	struct spi_device *spi = to_spi_device(wilc->dev);
 166	struct wilc_spi *spi_priv = wilc->bus_data;
 167	struct wilc_gpios *gpios = &spi_priv->gpios;
 168
 169	/* get ENABLE pin and deassert it (if it is defined): */
 170	gpios->enable = devm_gpiod_get_optional(&spi->dev,
 171						"enable", GPIOD_OUT_LOW);
 172	/* get RESET pin and assert it (if it is defined): */
 173	if (gpios->enable) {
 174		/* if enable pin exists, reset must exist as well */
 175		gpios->reset = devm_gpiod_get(&spi->dev,
 176					      "reset", GPIOD_OUT_HIGH);
 177		if (IS_ERR(gpios->reset)) {
 178			dev_err(&spi->dev, "missing reset gpio.\n");
 179			return PTR_ERR(gpios->reset);
 180		}
 181	} else {
 182		gpios->reset = devm_gpiod_get_optional(&spi->dev,
 183						       "reset", GPIOD_OUT_HIGH);
 184	}
 185	return 0;
 186}
 187
 188static void wilc_wlan_power(struct wilc *wilc, bool on)
 189{
 190	struct wilc_spi *spi_priv = wilc->bus_data;
 191	struct wilc_gpios *gpios = &spi_priv->gpios;
 192
 193	if (on) {
 194		/* assert ENABLE: */
 195		gpiod_set_value(gpios->enable, 1);
 196		mdelay(5);
 
 
 
 197		/* deassert RESET: */
 198		gpiod_set_value(gpios->reset, 0);
 199	} else {
 200		/* assert RESET: */
 201		gpiod_set_value(gpios->reset, 1);
 202		/* deassert ENABLE: */
 203		gpiod_set_value(gpios->enable, 0);
 204	}
 205}
 206
 207static int wilc_bus_probe(struct spi_device *spi)
 208{
 209	int ret;
 210	struct wilc *wilc;
 211	struct wilc_spi *spi_priv;
 212
 213	spi_priv = kzalloc(sizeof(*spi_priv), GFP_KERNEL);
 214	if (!spi_priv)
 215		return -ENOMEM;
 216
 217	ret = wilc_cfg80211_init(&wilc, &spi->dev, WILC_HIF_SPI, &wilc_hif_spi);
 218	if (ret)
 219		goto free;
 220
 221	spi_set_drvdata(spi, wilc);
 222	wilc->dev = &spi->dev;
 223	wilc->bus_data = spi_priv;
 224	wilc->dev_irq_num = spi->irq;
 225
 226	ret = wilc_parse_gpios(wilc);
 227	if (ret < 0)
 228		goto netdev_cleanup;
 229
 230	wilc->rtc_clk = devm_clk_get_optional(&spi->dev, "rtc");
 231	if (IS_ERR(wilc->rtc_clk)) {
 232		ret = PTR_ERR(wilc->rtc_clk);
 233		goto netdev_cleanup;
 234	}
 235	clk_prepare_enable(wilc->rtc_clk);
 236
 237	dev_info(&spi->dev, "Selected CRC config: crc7=%s, crc16=%s\n",
 238		 enable_crc7 ? "on" : "off", enable_crc16 ? "on" : "off");
 239
 240	/* we need power to configure the bus protocol and to read the chip id: */
 241
 242	wilc_wlan_power(wilc, true);
 243
 244	ret = wilc_spi_configure_bus_protocol(wilc);
 245	if (ret)
 246		goto power_down;
 247
 248	ret = wilc_validate_chipid(wilc);
 249	if (ret)
 250		goto power_down;
 251
 252	wilc_wlan_power(wilc, false);
 253	return 0;
 254
 255power_down:
 256	clk_disable_unprepare(wilc->rtc_clk);
 257	wilc_wlan_power(wilc, false);
 258netdev_cleanup:
 259	wilc_netdev_cleanup(wilc);
 260free:
 261	kfree(spi_priv);
 262	return ret;
 263}
 264
 265static void wilc_bus_remove(struct spi_device *spi)
 266{
 267	struct wilc *wilc = spi_get_drvdata(spi);
 268	struct wilc_spi *spi_priv = wilc->bus_data;
 269
 270	clk_disable_unprepare(wilc->rtc_clk);
 271	wilc_netdev_cleanup(wilc);
 272	kfree(spi_priv);
 273}
 274
 275static const struct of_device_id wilc_of_match[] = {
 276	{ .compatible = "microchip,wilc1000", },
 277	{ /* sentinel */ }
 278};
 279MODULE_DEVICE_TABLE(of, wilc_of_match);
 280
 281static const struct spi_device_id wilc_spi_id[] = {
 282	{ "wilc1000", 0 },
 283	{ /* sentinel */ }
 284};
 285MODULE_DEVICE_TABLE(spi, wilc_spi_id);
 286
 287static struct spi_driver wilc_spi_driver = {
 288	.driver = {
 289		.name = SPI_MODALIAS,
 290		.of_match_table = wilc_of_match,
 291	},
 292	.id_table = wilc_spi_id,
 293	.probe =  wilc_bus_probe,
 294	.remove = wilc_bus_remove,
 295};
 296module_spi_driver(wilc_spi_driver);
 297MODULE_DESCRIPTION("Atmel WILC1000 SPI wireless driver");
 298MODULE_LICENSE("GPL");
 299
 300static int wilc_spi_tx(struct wilc *wilc, u8 *b, u32 len)
 301{
 302	struct spi_device *spi = to_spi_device(wilc->dev);
 303	int ret;
 304	struct spi_message msg;
 305
 306	if (len > 0 && b) {
 307		struct spi_transfer tr = {
 308			.tx_buf = b,
 309			.len = len,
 310			.delay = {
 311				.value = 0,
 312				.unit = SPI_DELAY_UNIT_USECS
 313			},
 314		};
 315		char *r_buffer = kzalloc(len, GFP_KERNEL);
 316
 317		if (!r_buffer)
 318			return -ENOMEM;
 319
 320		tr.rx_buf = r_buffer;
 321		dev_dbg(&spi->dev, "Request writing %d bytes\n", len);
 322
 323		memset(&msg, 0, sizeof(msg));
 324		spi_message_init(&msg);
 
 325		spi_message_add_tail(&tr, &msg);
 326
 327		ret = spi_sync(spi, &msg);
 328		if (ret < 0)
 329			dev_err(&spi->dev, "SPI transaction failed\n");
 330
 331		kfree(r_buffer);
 332	} else {
 333		dev_err(&spi->dev,
 334			"can't write data with the following length: %d\n",
 335			len);
 336		ret = -EINVAL;
 337	}
 338
 339	return ret;
 340}
 341
 342static int wilc_spi_rx(struct wilc *wilc, u8 *rb, u32 rlen)
 343{
 344	struct spi_device *spi = to_spi_device(wilc->dev);
 345	int ret;
 346
 347	if (rlen > 0) {
 348		struct spi_message msg;
 349		struct spi_transfer tr = {
 350			.rx_buf = rb,
 351			.len = rlen,
 352			.delay = {
 353				.value = 0,
 354				.unit = SPI_DELAY_UNIT_USECS
 355			},
 356
 357		};
 358		char *t_buffer = kzalloc(rlen, GFP_KERNEL);
 359
 360		if (!t_buffer)
 361			return -ENOMEM;
 362
 363		tr.tx_buf = t_buffer;
 364
 365		memset(&msg, 0, sizeof(msg));
 366		spi_message_init(&msg);
 
 367		spi_message_add_tail(&tr, &msg);
 368
 369		ret = spi_sync(spi, &msg);
 370		if (ret < 0)
 371			dev_err(&spi->dev, "SPI transaction failed\n");
 372		kfree(t_buffer);
 373	} else {
 374		dev_err(&spi->dev,
 375			"can't read data with the following length: %u\n",
 376			rlen);
 377		ret = -EINVAL;
 378	}
 379
 380	return ret;
 381}
 382
 383static int wilc_spi_tx_rx(struct wilc *wilc, u8 *wb, u8 *rb, u32 rlen)
 384{
 385	struct spi_device *spi = to_spi_device(wilc->dev);
 386	int ret;
 387
 388	if (rlen > 0) {
 389		struct spi_message msg;
 390		struct spi_transfer tr = {
 391			.rx_buf = rb,
 392			.tx_buf = wb,
 393			.len = rlen,
 394			.bits_per_word = 8,
 395			.delay = {
 396				.value = 0,
 397				.unit = SPI_DELAY_UNIT_USECS
 398			},
 399
 400		};
 401
 402		memset(&msg, 0, sizeof(msg));
 403		spi_message_init(&msg);
 
 
 404		spi_message_add_tail(&tr, &msg);
 405		ret = spi_sync(spi, &msg);
 406		if (ret < 0)
 407			dev_err(&spi->dev, "SPI transaction failed\n");
 408	} else {
 409		dev_err(&spi->dev,
 410			"can't read data with the following length: %u\n",
 411			rlen);
 412		ret = -EINVAL;
 413	}
 414
 415	return ret;
 416}
 417
 418static int spi_data_write(struct wilc *wilc, u8 *b, u32 sz)
 419{
 420	struct spi_device *spi = to_spi_device(wilc->dev);
 421	struct wilc_spi *spi_priv = wilc->bus_data;
 422	int ix, nbytes;
 423	int result = 0;
 424	u8 cmd, order, crc[2];
 425	u16 crc_calc;
 426
 427	/*
 428	 * Data
 429	 */
 430	ix = 0;
 431	do {
 432		if (sz <= DATA_PKT_SZ) {
 433			nbytes = sz;
 434			order = 0x3;
 435		} else {
 436			nbytes = DATA_PKT_SZ;
 437			if (ix == 0)
 438				order = 0x1;
 439			else
 440				order = 0x02;
 441		}
 442
 443		/*
 444		 * Write command
 445		 */
 446		cmd = 0xf0;
 447		cmd |= order;
 448
 449		if (wilc_spi_tx(wilc, &cmd, 1)) {
 450			dev_err(&spi->dev,
 451				"Failed data block cmd write, bus error...\n");
 452			result = -EINVAL;
 453			break;
 454		}
 455
 456		/*
 457		 * Write data
 458		 */
 459		if (wilc_spi_tx(wilc, &b[ix], nbytes)) {
 460			dev_err(&spi->dev,
 461				"Failed data block write, bus error...\n");
 462			result = -EINVAL;
 463			break;
 464		}
 465
 466		/*
 467		 * Write CRC
 468		 */
 469		if (spi_priv->crc16_enabled) {
 470			crc_calc = crc_itu_t(0xffff, &b[ix], nbytes);
 471			crc[0] = crc_calc >> 8;
 472			crc[1] = crc_calc;
 473			if (wilc_spi_tx(wilc, crc, 2)) {
 474				dev_err(&spi->dev, "Failed data block crc write, bus error...\n");
 475				result = -EINVAL;
 476				break;
 477			}
 478		}
 479
 480		/*
 481		 * No need to wait for response
 482		 */
 483		ix += nbytes;
 484		sz -= nbytes;
 485	} while (sz);
 486
 487	return result;
 488}
 489
 490/********************************************
 491 *
 492 *      Spi Internal Read/Write Function
 493 *
 494 ********************************************/
 495static u8 wilc_get_crc7(u8 *buffer, u32 len)
 496{
 497	return crc7_be(0xfe, buffer, len) | 0x01;
 498}
 499
 500static int wilc_spi_single_read(struct wilc *wilc, u8 cmd, u32 adr, void *b,
 501				u8 clockless)
 502{
 503	struct spi_device *spi = to_spi_device(wilc->dev);
 504	struct wilc_spi *spi_priv = wilc->bus_data;
 505	u8 wb[32], rb[32];
 506	int cmd_len, resp_len, i;
 507	u16 crc_calc, crc_recv;
 508	struct wilc_spi_cmd *c;
 509	struct wilc_spi_rsp_data *r;
 510	struct wilc_spi_read_rsp_data *r_data;
 511
 512	memset(wb, 0x0, sizeof(wb));
 513	memset(rb, 0x0, sizeof(rb));
 514	c = (struct wilc_spi_cmd *)wb;
 515	c->cmd_type = cmd;
 516	if (cmd == CMD_SINGLE_READ) {
 517		c->u.simple_cmd.addr[0] = adr >> 16;
 518		c->u.simple_cmd.addr[1] = adr >> 8;
 519		c->u.simple_cmd.addr[2] = adr;
 520	} else if (cmd == CMD_INTERNAL_READ) {
 521		c->u.simple_cmd.addr[0] = adr >> 8;
 522		if (clockless == 1)
 523			c->u.simple_cmd.addr[0] |= BIT(7);
 524		c->u.simple_cmd.addr[1] = adr;
 525		c->u.simple_cmd.addr[2] = 0x0;
 526	} else {
 527		dev_err(&spi->dev, "cmd [%x] not supported\n", cmd);
 528		return -EINVAL;
 529	}
 530
 531	cmd_len = offsetof(struct wilc_spi_cmd, u.simple_cmd.crc);
 532	resp_len = sizeof(*r) + sizeof(*r_data) + WILC_SPI_RSP_HDR_EXTRA_DATA;
 533
 534	if (spi_priv->crc7_enabled) {
 535		c->u.simple_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 536		cmd_len += 1;
 537		resp_len += 2;
 538	}
 539
 540	if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
 541		dev_err(&spi->dev,
 542			"spi buffer size too small (%d) (%d) (%zu)\n",
 543			cmd_len, resp_len, ARRAY_SIZE(wb));
 544		return -EINVAL;
 545	}
 546
 547	if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
 548		dev_err(&spi->dev, "Failed cmd write, bus error...\n");
 549		return -EINVAL;
 550	}
 551
 552	r = (struct wilc_spi_rsp_data *)&rb[cmd_len];
 553	if (r->rsp_cmd_type != cmd && !clockless) {
 554		if (!spi_priv->probing_crc)
 555			dev_err(&spi->dev,
 556				"Failed cmd, cmd (%02x), resp (%02x)\n",
 557				cmd, r->rsp_cmd_type);
 558		return -EINVAL;
 559	}
 560
 561	if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS && !clockless) {
 562		dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
 563			r->status);
 564		return -EINVAL;
 565	}
 566
 567	for (i = 0; i < WILC_SPI_RSP_HDR_EXTRA_DATA; ++i)
 568		if (WILC_GET_RESP_HDR_START(r->data[i]) == 0xf)
 569			break;
 570
 571	if (i >= WILC_SPI_RSP_HDR_EXTRA_DATA) {
 572		dev_err(&spi->dev, "Error, data start missing\n");
 573		return -EINVAL;
 574	}
 575
 576	r_data = (struct wilc_spi_read_rsp_data *)&r->data[i];
 577
 578	if (b)
 579		memcpy(b, r_data->data, 4);
 580
 581	if (!clockless && spi_priv->crc16_enabled) {
 582		crc_recv = (r_data->crc[0] << 8) | r_data->crc[1];
 583		crc_calc = crc_itu_t(0xffff, r_data->data, 4);
 584		if (crc_recv != crc_calc) {
 585			dev_err(&spi->dev, "%s: bad CRC 0x%04x "
 586				"(calculated 0x%04x)\n", __func__,
 587				crc_recv, crc_calc);
 588			return -EINVAL;
 589		}
 590	}
 591
 592	return 0;
 593}
 594
 595static int wilc_spi_write_cmd(struct wilc *wilc, u8 cmd, u32 adr, u32 data,
 596			      u8 clockless)
 597{
 598	struct spi_device *spi = to_spi_device(wilc->dev);
 599	struct wilc_spi *spi_priv = wilc->bus_data;
 600	u8 wb[32], rb[32];
 601	int cmd_len, resp_len;
 602	struct wilc_spi_cmd *c;
 603	struct wilc_spi_rsp_data *r;
 604
 605	memset(wb, 0x0, sizeof(wb));
 606	memset(rb, 0x0, sizeof(rb));
 607	c = (struct wilc_spi_cmd *)wb;
 608	c->cmd_type = cmd;
 609	if (cmd == CMD_INTERNAL_WRITE) {
 610		c->u.internal_w_cmd.addr[0] = adr >> 8;
 611		if (clockless == 1)
 612			c->u.internal_w_cmd.addr[0] |= BIT(7);
 613
 614		c->u.internal_w_cmd.addr[1] = adr;
 615		c->u.internal_w_cmd.data = cpu_to_be32(data);
 616		cmd_len = offsetof(struct wilc_spi_cmd, u.internal_w_cmd.crc);
 617		if (spi_priv->crc7_enabled)
 618			c->u.internal_w_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 619	} else if (cmd == CMD_SINGLE_WRITE) {
 620		c->u.w_cmd.addr[0] = adr >> 16;
 621		c->u.w_cmd.addr[1] = adr >> 8;
 622		c->u.w_cmd.addr[2] = adr;
 623		c->u.w_cmd.data = cpu_to_be32(data);
 624		cmd_len = offsetof(struct wilc_spi_cmd, u.w_cmd.crc);
 625		if (spi_priv->crc7_enabled)
 626			c->u.w_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 627	} else {
 628		dev_err(&spi->dev, "write cmd [%x] not supported\n", cmd);
 629		return -EINVAL;
 630	}
 631
 632	if (spi_priv->crc7_enabled)
 633		cmd_len += 1;
 634
 635	resp_len = sizeof(*r);
 636
 637	if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
 638		dev_err(&spi->dev,
 639			"spi buffer size too small (%d) (%d) (%zu)\n",
 640			cmd_len, resp_len, ARRAY_SIZE(wb));
 641		return -EINVAL;
 642	}
 643
 644	if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
 645		dev_err(&spi->dev, "Failed cmd write, bus error...\n");
 646		return -EINVAL;
 647	}
 648
 649	r = (struct wilc_spi_rsp_data *)&rb[cmd_len];
 650	/*
 651	 * Clockless registers operations might return unexptected responses,
 652	 * even if successful.
 653	 */
 654	if (r->rsp_cmd_type != cmd && !clockless) {
 655		dev_err(&spi->dev,
 656			"Failed cmd response, cmd (%02x), resp (%02x)\n",
 657			cmd, r->rsp_cmd_type);
 658		return -EINVAL;
 659	}
 660
 661	if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS && !clockless) {
 662		dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
 663			r->status);
 664		return -EINVAL;
 665	}
 666
 667	return 0;
 668}
 669
 670static int wilc_spi_dma_rw(struct wilc *wilc, u8 cmd, u32 adr, u8 *b, u32 sz)
 671{
 672	struct spi_device *spi = to_spi_device(wilc->dev);
 673	struct wilc_spi *spi_priv = wilc->bus_data;
 674	u16 crc_recv, crc_calc;
 675	u8 wb[32], rb[32];
 676	int cmd_len, resp_len;
 677	int retry, ix = 0;
 678	u8 crc[2];
 679	struct wilc_spi_cmd *c;
 680	struct wilc_spi_rsp_data *r;
 681
 682	memset(wb, 0x0, sizeof(wb));
 683	memset(rb, 0x0, sizeof(rb));
 684	c = (struct wilc_spi_cmd *)wb;
 685	c->cmd_type = cmd;
 686	if (cmd == CMD_DMA_WRITE || cmd == CMD_DMA_READ) {
 687		c->u.dma_cmd.addr[0] = adr >> 16;
 688		c->u.dma_cmd.addr[1] = adr >> 8;
 689		c->u.dma_cmd.addr[2] = adr;
 690		c->u.dma_cmd.size[0] = sz >> 8;
 691		c->u.dma_cmd.size[1] = sz;
 692		cmd_len = offsetof(struct wilc_spi_cmd, u.dma_cmd.crc);
 693		if (spi_priv->crc7_enabled)
 694			c->u.dma_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 695	} else if (cmd == CMD_DMA_EXT_WRITE || cmd == CMD_DMA_EXT_READ) {
 696		c->u.dma_cmd_ext.addr[0] = adr >> 16;
 697		c->u.dma_cmd_ext.addr[1] = adr >> 8;
 698		c->u.dma_cmd_ext.addr[2] = adr;
 699		c->u.dma_cmd_ext.size[0] = sz >> 16;
 700		c->u.dma_cmd_ext.size[1] = sz >> 8;
 701		c->u.dma_cmd_ext.size[2] = sz;
 702		cmd_len = offsetof(struct wilc_spi_cmd, u.dma_cmd_ext.crc);
 703		if (spi_priv->crc7_enabled)
 704			c->u.dma_cmd_ext.crc[0] = wilc_get_crc7(wb, cmd_len);
 705	} else {
 706		dev_err(&spi->dev, "dma read write cmd [%x] not supported\n",
 707			cmd);
 708		return -EINVAL;
 709	}
 710	if (spi_priv->crc7_enabled)
 711		cmd_len += 1;
 712
 713	resp_len = sizeof(*r);
 714
 715	if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
 716		dev_err(&spi->dev, "spi buffer size too small (%d)(%d) (%zu)\n",
 717			cmd_len, resp_len, ARRAY_SIZE(wb));
 718		return -EINVAL;
 719	}
 720
 721	if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
 722		dev_err(&spi->dev, "Failed cmd write, bus error...\n");
 723		return -EINVAL;
 724	}
 725
 726	r = (struct wilc_spi_rsp_data *)&rb[cmd_len];
 727	if (r->rsp_cmd_type != cmd) {
 728		dev_err(&spi->dev,
 729			"Failed cmd response, cmd (%02x), resp (%02x)\n",
 730			cmd, r->rsp_cmd_type);
 731		return -EINVAL;
 732	}
 733
 734	if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS) {
 735		dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
 736			r->status);
 737		return -EINVAL;
 738	}
 739
 740	if (cmd == CMD_DMA_WRITE || cmd == CMD_DMA_EXT_WRITE)
 741		return 0;
 742
 743	while (sz > 0) {
 744		int nbytes;
 745		u8 rsp;
 746
 747		nbytes = min_t(u32, sz, DATA_PKT_SZ);
 748
 749		/*
 750		 * Data Response header
 751		 */
 752		retry = 100;
 753		do {
 754			if (wilc_spi_rx(wilc, &rsp, 1)) {
 755				dev_err(&spi->dev,
 756					"Failed resp read, bus err\n");
 757				return -EINVAL;
 758			}
 759			if (WILC_GET_RESP_HDR_START(rsp) == 0xf)
 760				break;
 761		} while (retry--);
 762
 763		/*
 764		 * Read bytes
 765		 */
 766		if (wilc_spi_rx(wilc, &b[ix], nbytes)) {
 767			dev_err(&spi->dev,
 768				"Failed block read, bus err\n");
 769			return -EINVAL;
 770		}
 771
 772		/*
 773		 * Read CRC
 774		 */
 775		if (spi_priv->crc16_enabled) {
 776			if (wilc_spi_rx(wilc, crc, 2)) {
 777				dev_err(&spi->dev,
 778					"Failed block CRC read, bus err\n");
 779				return -EINVAL;
 780			}
 781			crc_recv = (crc[0] << 8) | crc[1];
 782			crc_calc = crc_itu_t(0xffff, &b[ix], nbytes);
 783			if (crc_recv != crc_calc) {
 784				dev_err(&spi->dev, "%s: bad CRC 0x%04x "
 785					"(calculated 0x%04x)\n", __func__,
 786					crc_recv, crc_calc);
 787				return -EINVAL;
 788			}
 789		}
 790
 791		ix += nbytes;
 792		sz -= nbytes;
 793	}
 794	return 0;
 795}
 796
 797static int wilc_spi_special_cmd(struct wilc *wilc, u8 cmd)
 798{
 799	struct spi_device *spi = to_spi_device(wilc->dev);
 800	struct wilc_spi *spi_priv = wilc->bus_data;
 801	u8 wb[32], rb[32];
 802	int cmd_len, resp_len = 0;
 803	struct wilc_spi_cmd *c;
 804	struct wilc_spi_special_cmd_rsp *r;
 805
 806	if (cmd != CMD_TERMINATE && cmd != CMD_REPEAT && cmd != CMD_RESET)
 807		return -EINVAL;
 808
 809	memset(wb, 0x0, sizeof(wb));
 810	memset(rb, 0x0, sizeof(rb));
 811	c = (struct wilc_spi_cmd *)wb;
 812	c->cmd_type = cmd;
 813
 814	if (cmd == CMD_RESET)
 815		memset(c->u.simple_cmd.addr, 0xFF, 3);
 816
 817	cmd_len = offsetof(struct wilc_spi_cmd, u.simple_cmd.crc);
 818	resp_len = sizeof(*r);
 819
 820	if (spi_priv->crc7_enabled) {
 821		c->u.simple_cmd.crc[0] = wilc_get_crc7(wb, cmd_len);
 822		cmd_len += 1;
 823	}
 824	if (cmd_len + resp_len > ARRAY_SIZE(wb)) {
 825		dev_err(&spi->dev, "spi buffer size too small (%d) (%d) (%zu)\n",
 826			cmd_len, resp_len, ARRAY_SIZE(wb));
 827		return -EINVAL;
 828	}
 829
 830	if (wilc_spi_tx_rx(wilc, wb, rb, cmd_len + resp_len)) {
 831		dev_err(&spi->dev, "Failed cmd write, bus error...\n");
 832		return -EINVAL;
 833	}
 834
 835	r = (struct wilc_spi_special_cmd_rsp *)&rb[cmd_len];
 836	if (r->rsp_cmd_type != cmd) {
 837		if (!spi_priv->probing_crc)
 838			dev_err(&spi->dev,
 839				"Failed cmd response, cmd (%02x), resp (%02x)\n",
 840				cmd, r->rsp_cmd_type);
 841		return -EINVAL;
 842	}
 843
 844	if (r->status != WILC_SPI_COMMAND_STAT_SUCCESS) {
 845		dev_err(&spi->dev, "Failed cmd state response state (%02x)\n",
 846			r->status);
 847		return -EINVAL;
 848	}
 849	return 0;
 850}
 851
 852static void wilc_spi_reset_cmd_sequence(struct wilc *wl, u8 attempt, u32 addr)
 853{
 854	struct spi_device *spi = to_spi_device(wl->dev);
 855	struct wilc_spi *spi_priv = wl->bus_data;
 856
 857	if (!spi_priv->probing_crc)
 858		dev_err(&spi->dev, "Reset and retry %d %x\n", attempt, addr);
 859
 860	usleep_range(1000, 1100);
 861	wilc_spi_reset(wl);
 862	usleep_range(1000, 1100);
 863}
 864
 865static int wilc_spi_read_reg(struct wilc *wilc, u32 addr, u32 *data)
 866{
 867	struct spi_device *spi = to_spi_device(wilc->dev);
 868	int result;
 869	u8 cmd = CMD_SINGLE_READ;
 870	u8 clockless = 0;
 871	u8 i;
 872
 873	if (addr <= WILC_SPI_CLOCKLESS_ADDR_LIMIT) {
 874		/* Clockless register */
 875		cmd = CMD_INTERNAL_READ;
 876		clockless = 1;
 877	}
 878
 879	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 880		result = wilc_spi_single_read(wilc, cmd, addr, data, clockless);
 881		if (!result) {
 882			le32_to_cpus(data);
 883			return 0;
 884		}
 885
 886		/* retry is not applicable for clockless registers */
 887		if (clockless)
 888			break;
 889
 890		dev_err(&spi->dev, "Failed cmd, read reg (%08x)...\n", addr);
 891		wilc_spi_reset_cmd_sequence(wilc, i, addr);
 892	}
 893
 894	return result;
 895}
 896
 897static int wilc_spi_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
 898{
 899	struct spi_device *spi = to_spi_device(wilc->dev);
 900	int result;
 901	u8 i;
 902
 903	if (size <= 4)
 904		return -EINVAL;
 905
 906	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 907		result = wilc_spi_dma_rw(wilc, CMD_DMA_EXT_READ, addr,
 908					 buf, size);
 909		if (!result)
 910			return 0;
 911
 912		dev_err(&spi->dev, "Failed cmd, read block (%08x)...\n", addr);
 913
 914		wilc_spi_reset_cmd_sequence(wilc, i, addr);
 915	}
 916
 917	return result;
 918}
 919
 920static int spi_internal_write(struct wilc *wilc, u32 adr, u32 dat)
 921{
 922	struct spi_device *spi = to_spi_device(wilc->dev);
 923	int result;
 924	u8 i;
 925
 926	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 927		result = wilc_spi_write_cmd(wilc, CMD_INTERNAL_WRITE, adr,
 928					    dat, 0);
 929		if (!result)
 930			return 0;
 931		dev_err(&spi->dev, "Failed internal write cmd...\n");
 932
 933		wilc_spi_reset_cmd_sequence(wilc, i, adr);
 934	}
 935
 936	return result;
 937}
 938
 939static int spi_internal_read(struct wilc *wilc, u32 adr, u32 *data)
 940{
 941	struct spi_device *spi = to_spi_device(wilc->dev);
 942	struct wilc_spi *spi_priv = wilc->bus_data;
 943	int result;
 944	u8 i;
 945
 946	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 947		result = wilc_spi_single_read(wilc, CMD_INTERNAL_READ, adr,
 948					      data, 0);
 949		if (!result) {
 950			le32_to_cpus(data);
 951			return 0;
 952		}
 953		if (!spi_priv->probing_crc)
 954			dev_err(&spi->dev, "Failed internal read cmd...\n");
 955
 956		wilc_spi_reset_cmd_sequence(wilc, i, adr);
 957	}
 958
 959	return result;
 960}
 961
 962/********************************************
 963 *
 964 *      Spi interfaces
 965 *
 966 ********************************************/
 967
 968static int wilc_spi_write_reg(struct wilc *wilc, u32 addr, u32 data)
 969{
 970	struct spi_device *spi = to_spi_device(wilc->dev);
 971	int result;
 972	u8 cmd = CMD_SINGLE_WRITE;
 973	u8 clockless = 0;
 974	u8 i;
 975
 976	if (addr <= WILC_SPI_CLOCKLESS_ADDR_LIMIT) {
 977		/* Clockless register */
 978		cmd = CMD_INTERNAL_WRITE;
 979		clockless = 1;
 980	}
 981
 982	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
 983		result = wilc_spi_write_cmd(wilc, cmd, addr, data, clockless);
 984		if (!result)
 985			return 0;
 986
 987		dev_err(&spi->dev, "Failed cmd, write reg (%08x)...\n", addr);
 988
 989		if (clockless)
 990			break;
 991
 992		wilc_spi_reset_cmd_sequence(wilc, i, addr);
 993	}
 994	return result;
 995}
 996
 997static int spi_data_rsp(struct wilc *wilc, u8 cmd)
 998{
 999	struct spi_device *spi = to_spi_device(wilc->dev);
1000	int result, i;
1001	u8 rsp[4];
1002
1003	/*
1004	 * The response to data packets is two bytes long.  For
1005	 * efficiency's sake, wilc_spi_write() wisely ignores the
1006	 * responses for all packets but the final one.  The downside
1007	 * of that optimization is that when the final data packet is
1008	 * short, we may receive (part of) the response to the
1009	 * second-to-last packet before the one for the final packet.
1010	 * To handle this, we always read 4 bytes and then search for
1011	 * the last byte that contains the "Response Start" code (0xc
1012	 * in the top 4 bits).  We then know that this byte is the
1013	 * first response byte of the final data packet.
1014	 */
1015	result = wilc_spi_rx(wilc, rsp, sizeof(rsp));
1016	if (result) {
1017		dev_err(&spi->dev, "Failed bus error...\n");
1018		return result;
1019	}
1020
1021	for (i = sizeof(rsp) - 2; i >= 0; --i)
1022		if (FIELD_GET(RSP_START_FIELD, rsp[i]) == RSP_START_TAG)
1023			break;
1024
1025	if (i < 0) {
1026		dev_err(&spi->dev,
1027			"Data packet response missing (%02x %02x %02x %02x)\n",
1028			rsp[0], rsp[1], rsp[2], rsp[3]);
1029		return -1;
1030	}
1031
1032	/* rsp[i] is the last response start byte */
1033
1034	if (FIELD_GET(RSP_TYPE_FIELD, rsp[i]) != RSP_TYPE_LAST_PACKET
1035	    || rsp[i + 1] != RSP_STATE_NO_ERROR) {
1036		dev_err(&spi->dev, "Data response error (%02x %02x)\n",
1037			rsp[i], rsp[i + 1]);
1038		return -1;
1039	}
1040	return 0;
1041}
1042
1043static int wilc_spi_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
1044{
1045	struct spi_device *spi = to_spi_device(wilc->dev);
1046	int result;
1047	u8 i;
1048
1049	/*
1050	 * has to be greated than 4
1051	 */
1052	if (size <= 4)
1053		return -EINVAL;
1054
1055	for (i = 0; i < SPI_RETRY_MAX_LIMIT; i++) {
1056		result = wilc_spi_dma_rw(wilc, CMD_DMA_EXT_WRITE, addr,
1057					 NULL, size);
1058		if (result) {
1059			dev_err(&spi->dev,
1060				"Failed cmd, write block (%08x)...\n", addr);
1061			wilc_spi_reset_cmd_sequence(wilc, i, addr);
1062			continue;
1063		}
1064
1065		/*
1066		 * Data
1067		 */
1068		result = spi_data_write(wilc, buf, size);
1069		if (result) {
1070			dev_err(&spi->dev, "Failed block data write...\n");
1071			wilc_spi_reset_cmd_sequence(wilc, i, addr);
1072			continue;
1073		}
1074
1075		/*
1076		 * Data response
1077		 */
1078		result = spi_data_rsp(wilc, CMD_DMA_EXT_WRITE);
1079		if (result) {
1080			dev_err(&spi->dev, "Failed block data rsp...\n");
1081			wilc_spi_reset_cmd_sequence(wilc, i, addr);
1082			continue;
1083		}
1084		break;
1085	}
1086	return result;
1087}
1088
1089/********************************************
1090 *
1091 *      Bus interfaces
1092 *
1093 ********************************************/
1094
1095static int wilc_spi_reset(struct wilc *wilc)
1096{
1097	struct spi_device *spi = to_spi_device(wilc->dev);
1098	struct wilc_spi *spi_priv = wilc->bus_data;
1099	int result;
1100
1101	result = wilc_spi_special_cmd(wilc, CMD_RESET);
1102	if (result && !spi_priv->probing_crc)
1103		dev_err(&spi->dev, "Failed cmd reset\n");
1104
1105	return result;
1106}
1107
1108static bool wilc_spi_is_init(struct wilc *wilc)
1109{
1110	struct wilc_spi *spi_priv = wilc->bus_data;
1111
1112	return spi_priv->isinit;
1113}
1114
1115static int wilc_spi_deinit(struct wilc *wilc)
1116{
1117	struct wilc_spi *spi_priv = wilc->bus_data;
1118
1119	spi_priv->isinit = false;
1120	wilc_wlan_power(wilc, false);
1121	return 0;
1122}
1123
1124static int wilc_spi_init(struct wilc *wilc, bool resume)
1125{
 
1126	struct wilc_spi *spi_priv = wilc->bus_data;
1127	int ret;
 
 
1128
1129	if (spi_priv->isinit) {
1130		/* Confirm we can read chipid register without error: */
1131		if (wilc_validate_chipid(wilc) == 0)
 
1132			return 0;
 
 
1133	}
1134
1135	wilc_wlan_power(wilc, true);
1136
1137	ret = wilc_spi_configure_bus_protocol(wilc);
1138	if (ret) {
1139		wilc_wlan_power(wilc, false);
1140		return ret;
1141	}
1142
1143	spi_priv->isinit = true;
1144
1145	return 0;
1146}
1147
1148static int wilc_spi_configure_bus_protocol(struct wilc *wilc)
1149{
1150	struct spi_device *spi = to_spi_device(wilc->dev);
1151	struct wilc_spi *spi_priv = wilc->bus_data;
1152	u32 reg;
1153	int ret, i;
1154
1155	/*
1156	 * Infer the CRC settings that are currently in effect.  This
1157	 * is necessary because we can't be sure that the chip has
1158	 * been RESET (e.g, after module unload and reload).
1159	 */
1160	spi_priv->probing_crc = true;
1161	spi_priv->crc7_enabled = enable_crc7;
1162	spi_priv->crc16_enabled = false; /* don't check CRC16 during probing */
1163	for (i = 0; i < 2; ++i) {
1164		ret = spi_internal_read(wilc, WILC_SPI_PROTOCOL_OFFSET, &reg);
1165		if (ret == 0)
1166			break;
1167		spi_priv->crc7_enabled = !enable_crc7;
1168	}
1169	if (ret) {
1170		dev_err(&spi->dev, "Failed with CRC7 on and off.\n");
1171		return ret;
1172	}
1173
1174	/* set up the desired CRC configuration: */
1175	reg &= ~(PROTOCOL_REG_CRC7_MASK | PROTOCOL_REG_CRC16_MASK);
1176	if (enable_crc7)
1177		reg |= PROTOCOL_REG_CRC7_MASK;
1178	if (enable_crc16)
1179		reg |= PROTOCOL_REG_CRC16_MASK;
1180
1181	/* set up the data packet size: */
1182	BUILD_BUG_ON(DATA_PKT_LOG_SZ < DATA_PKT_LOG_SZ_MIN
1183		     || DATA_PKT_LOG_SZ > DATA_PKT_LOG_SZ_MAX);
1184	reg &= ~PROTOCOL_REG_PKT_SZ_MASK;
1185	reg |= FIELD_PREP(PROTOCOL_REG_PKT_SZ_MASK,
1186			  DATA_PKT_LOG_SZ - DATA_PKT_LOG_SZ_MIN);
1187
1188	/* establish the new setup: */
1189	ret = spi_internal_write(wilc, WILC_SPI_PROTOCOL_OFFSET, reg);
1190	if (ret) {
1191		dev_err(&spi->dev,
1192			"[wilc spi %d]: Failed internal write reg\n",
1193			__LINE__);
1194		return ret;
1195	}
1196	/* update our state to match new protocol settings: */
1197	spi_priv->crc7_enabled = enable_crc7;
1198	spi_priv->crc16_enabled = enable_crc16;
1199
1200	/* re-read to make sure new settings are in effect: */
1201	spi_internal_read(wilc, WILC_SPI_PROTOCOL_OFFSET, &reg);
1202
1203	spi_priv->probing_crc = false;
1204
1205	return 0;
1206}
1207
1208static int wilc_validate_chipid(struct wilc *wilc)
1209{
1210	struct spi_device *spi = to_spi_device(wilc->dev);
1211	u32 chipid;
1212	int ret;
1213
1214	/*
1215	 * make sure can read chip id without protocol error
1216	 */
1217	ret = wilc_spi_read_reg(wilc, WILC_CHIPID, &chipid);
1218	if (ret) {
1219		dev_err(&spi->dev, "Fail cmd read chip id...\n");
1220		return ret;
1221	}
1222	if (!is_wilc1000(chipid)) {
1223		dev_err(&spi->dev, "Unknown chip id 0x%x\n", chipid);
1224		return -ENODEV;
1225	}
1226	return 0;
1227}
1228
1229static int wilc_spi_read_size(struct wilc *wilc, u32 *size)
1230{
1231	int ret;
1232
1233	ret = spi_internal_read(wilc,
1234				WILC_SPI_INT_STATUS - WILC_SPI_REG_BASE, size);
1235	*size = FIELD_GET(IRQ_DMA_WD_CNT_MASK, *size);
1236
1237	return ret;
1238}
1239
1240static int wilc_spi_read_int(struct wilc *wilc, u32 *int_status)
1241{
1242	return spi_internal_read(wilc, WILC_SPI_INT_STATUS - WILC_SPI_REG_BASE,
1243				 int_status);
1244}
1245
1246static int wilc_spi_clear_int_ext(struct wilc *wilc, u32 val)
1247{
1248	int ret;
1249	int retry = SPI_ENABLE_VMM_RETRY_LIMIT;
1250	u32 check;
1251
1252	while (retry) {
1253		ret = spi_internal_write(wilc,
1254					 WILC_SPI_INT_CLEAR - WILC_SPI_REG_BASE,
1255					 val);
1256		if (ret)
1257			break;
1258
1259		ret = spi_internal_read(wilc,
1260					WILC_SPI_INT_CLEAR - WILC_SPI_REG_BASE,
1261					&check);
1262		if (ret || ((check & EN_VMM) == (val & EN_VMM)))
1263			break;
1264
1265		retry--;
1266	}
1267	return ret;
1268}
1269
1270static int wilc_spi_sync_ext(struct wilc *wilc, int nint)
1271{
1272	struct spi_device *spi = to_spi_device(wilc->dev);
1273	u32 reg;
1274	int ret, i;
1275
1276	if (nint > MAX_NUM_INT) {
1277		dev_err(&spi->dev, "Too many interrupts (%d)...\n", nint);
1278		return -EINVAL;
1279	}
1280
1281	/*
1282	 * interrupt pin mux select
1283	 */
1284	ret = wilc_spi_read_reg(wilc, WILC_PIN_MUX_0, &reg);
1285	if (ret) {
1286		dev_err(&spi->dev, "Failed read reg (%08x)...\n",
1287			WILC_PIN_MUX_0);
1288		return ret;
1289	}
1290	reg |= BIT(8);
1291	ret = wilc_spi_write_reg(wilc, WILC_PIN_MUX_0, reg);
1292	if (ret) {
1293		dev_err(&spi->dev, "Failed write reg (%08x)...\n",
1294			WILC_PIN_MUX_0);
1295		return ret;
1296	}
1297
1298	/*
1299	 * interrupt enable
1300	 */
1301	ret = wilc_spi_read_reg(wilc, WILC_INTR_ENABLE, &reg);
1302	if (ret) {
1303		dev_err(&spi->dev, "Failed read reg (%08x)...\n",
1304			WILC_INTR_ENABLE);
1305		return ret;
1306	}
1307
1308	for (i = 0; (i < 5) && (nint > 0); i++, nint--)
1309		reg |= (BIT((27 + i)));
1310
1311	ret = wilc_spi_write_reg(wilc, WILC_INTR_ENABLE, reg);
1312	if (ret) {
1313		dev_err(&spi->dev, "Failed write reg (%08x)...\n",
1314			WILC_INTR_ENABLE);
1315		return ret;
1316	}
1317	if (nint) {
1318		ret = wilc_spi_read_reg(wilc, WILC_INTR2_ENABLE, &reg);
1319		if (ret) {
1320			dev_err(&spi->dev, "Failed read reg (%08x)...\n",
1321				WILC_INTR2_ENABLE);
1322			return ret;
1323		}
1324
1325		for (i = 0; (i < 3) && (nint > 0); i++, nint--)
1326			reg |= BIT(i);
1327
1328		ret = wilc_spi_write_reg(wilc, WILC_INTR2_ENABLE, reg);
1329		if (ret) {
1330			dev_err(&spi->dev, "Failed write reg (%08x)...\n",
1331				WILC_INTR2_ENABLE);
1332			return ret;
1333		}
1334	}
1335
1336	return 0;
1337}
1338
1339/* Global spi HIF function table */
1340static const struct wilc_hif_func wilc_hif_spi = {
1341	.hif_init = wilc_spi_init,
1342	.hif_deinit = wilc_spi_deinit,
1343	.hif_read_reg = wilc_spi_read_reg,
1344	.hif_write_reg = wilc_spi_write_reg,
1345	.hif_block_rx = wilc_spi_read,
1346	.hif_block_tx = wilc_spi_write,
1347	.hif_read_int = wilc_spi_read_int,
1348	.hif_clear_int_ext = wilc_spi_clear_int_ext,
1349	.hif_read_size = wilc_spi_read_size,
1350	.hif_block_tx_ext = wilc_spi_write,
1351	.hif_block_rx_ext = wilc_spi_read,
1352	.hif_sync_ext = wilc_spi_sync_ext,
1353	.hif_reset = wilc_spi_reset,
1354	.hif_is_init = wilc_spi_is_init,
1355};