1 /*
2  * Marvell 88E6xxx Switch Global (1) Registers support
3  *
4  * Copyright (c) 2008 Marvell Semiconductor
5  *
6  * Copyright (c) 2016 Vivien Didelot <vivien.didelot@savoirfairelinux.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #include "mv88e6xxx.h"
15 #include "global1.h"
16 
17 int mv88e6xxx_g1_read(struct mv88e6xxx_chip *chip, int reg, u16 *val)
18 {
19 	int addr = chip->info->global1_addr;
20 
21 	return mv88e6xxx_read(chip, addr, reg, val);
22 }
23 
24 int mv88e6xxx_g1_write(struct mv88e6xxx_chip *chip, int reg, u16 val)
25 {
26 	int addr = chip->info->global1_addr;
27 
28 	return mv88e6xxx_write(chip, addr, reg, val);
29 }
30 
31 int mv88e6xxx_g1_wait(struct mv88e6xxx_chip *chip, int reg, u16 mask)
32 {
33 	return mv88e6xxx_wait(chip, chip->info->global1_addr, reg, mask);
34 }
35 
36 static int mv88e6xxx_g1_stats_wait(struct mv88e6xxx_chip *chip)
37 {
38 	return mv88e6xxx_g1_wait(chip, GLOBAL_STATS_OP, GLOBAL_STATS_OP_BUSY);
39 }
40 
41 int mv88e6xxx_g1_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
42 {
43 	int err;
44 
45 	/* Snapshot the hardware statistics counters for this port. */
46 	err = mv88e6xxx_g1_write(chip, GLOBAL_STATS_OP,
47 				 GLOBAL_STATS_OP_CAPTURE_PORT |
48 				 GLOBAL_STATS_OP_HIST_RX_TX | port);
49 	if (err)
50 		return err;
51 
52 	/* Wait for the snapshotting to complete. */
53 	return mv88e6xxx_g1_stats_wait(chip);
54 }
55 
56 int mv88e6320_g1_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
57 {
58 	port = (port + 1) << 5;
59 
60 	return mv88e6xxx_g1_stats_snapshot(chip, port);
61 }
62 
63 int mv88e6390_g1_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
64 {
65 	int err;
66 
67 	port = (port + 1) << 5;
68 
69 	/* Snapshot the hardware statistics counters for this port. */
70 	err = mv88e6xxx_g1_write(chip, GLOBAL_STATS_OP,
71 				 GLOBAL_STATS_OP_CAPTURE_PORT | port);
72 	if (err)
73 		return err;
74 
75 	/* Wait for the snapshotting to complete. */
76 	return mv88e6xxx_g1_stats_wait(chip);
77 }
78