/*
 * Copyright (C) 2012  Intel Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the
 * Free Software Foundation, Inc.,
 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef __NFC_SHDLC_H
#define __NFC_SHDLC_H

struct nfc_shdlc;

struct nfc_shdlc_ops {
	int (*open) (struct nfc_shdlc *shdlc);
	void (*close) (struct nfc_shdlc *shdlc);
	int (*hci_ready) (struct nfc_shdlc *shdlc);
	int (*xmit) (struct nfc_shdlc *shdlc, struct sk_buff *skb);
	int (*start_poll) (struct nfc_shdlc *shdlc, u32 protocols);
	int (*target_from_gate) (struct nfc_shdlc *shdlc, u8 gate,
				 struct nfc_target *target);
	int (*complete_target_discovered) (struct nfc_shdlc *shdlc, u8 gate,
					   struct nfc_target *target);
	int (*data_exchange) (struct nfc_shdlc *shdlc,
			      struct nfc_target *target,
			      struct sk_buff *skb, struct sk_buff **res_skb);
};

enum shdlc_state {
	SHDLC_DISCONNECTED = 0,
	SHDLC_CONNECTING = 1,
	SHDLC_NEGOCIATING = 2,
	SHDLC_CONNECTED = 3
};

struct nfc_shdlc {
	struct mutex state_mutex;
	enum shdlc_state state;
	int hard_fault;

	struct nfc_hci_dev *hdev;

	wait_queue_head_t *connect_wq;
	int connect_tries;
	int connect_result;
	struct timer_list connect_timer;/* aka T3 in spec 10.6.1 */

	u8 w;				/* window size */
	bool srej_support;

	struct timer_list t1_timer;	/* send ack timeout */
	bool t1_active;

	struct timer_list t2_timer;	/* guard/retransmit timeout */
	bool t2_active;

	int ns;				/* next seq num for send */
	int nr;				/* next expected seq num for receive */
	int dnr;			/* oldest sent unacked seq num */

	struct sk_buff_head rcv_q;

	struct sk_buff_head send_q;
	bool rnr;			/* other side is not ready to receive */

	struct sk_buff_head ack_pending_q;

	struct workqueue_struct *sm_wq;
	struct work_struct sm_work;

	struct nfc_shdlc_ops *ops;

	int client_headroom;
	int client_tailroom;

	void *clientdata;
};

void nfc_shdlc_recv_frame(struct nfc_shdlc *shdlc, struct sk_buff *skb);

struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops,
				     struct nfc_hci_init_data *init_data,
				     u32 protocols,
				     int tx_headroom, int tx_tailroom,
				     int max_link_payload, const char *devname);

void nfc_shdlc_free(struct nfc_shdlc *shdlc);

void nfc_shdlc_set_clientdata(struct nfc_shdlc *shdlc, void *clientdata);
void *nfc_shdlc_get_clientdata(struct nfc_shdlc *shdlc);
struct nfc_hci_dev *nfc_shdlc_get_hci_dev(struct nfc_shdlc *shdlc);

#endif /* __NFC_SHDLC_H */
